#token-stream #token #flatten #macro

token_stream_flatten

用于token流的扁平化迭代适配器

1个不稳定版本

0.1.0 2020年11月19日

#1682进程宏

MIT 许可协议

26KB
560

token_stream_flatten-rs

为Rust的token流提供扁平化迭代适配器。允许将Rust源代码处理为一系列基本token。

请参阅文档以获取详细信息。

许可协议

MIT 许可协议.


lib.rs:

为token流提供扁平化迭代适配器。

允许将Rust源代码处理为一系列基本token。

使用方法

可以通过flatten_rec方法获得适配器FlattenRec,该方法由proc-macro2's IntoIter实现的IntoFlattenRec特性提供。这对于方法链式调用很方便。

或者,可以直接使用FlattenRec's From<IntoIter>实现。

#
let stream = r#"if n > 1 { foo[n - 2] } else { 11 }"#
    .parse::<proc_macro2::TokenStream>()
    .unwrap();
let flat = stream.into_iter().flatten_rec().collect::<Vec<_>>();

assert_eq!(
    flat.iter().map(|token| token.to_string()).collect::<Vec<_>>(),
    vec!["if", "n", ">", "1", "{", "foo", "[", "n", "-", "2", "]", "}", "else", "{", "11", "}"],
);

assert_eq!(flat[2].span().start(), proc_macro2::LineColumn { line: 1, column: 5 });
assert_eq!(flat[2].span().end(), proc_macro2::LineColumn { line: 1, column: 6 });
if let Token::Punct(punct) = &flat[2] {
    assert_eq!(punct.as_char(), '>');
} else {
    panic!("expected punct");
}

assert_eq!(flat[10].span().start(), proc_macro2::LineColumn { line: 1, column: 20 });
assert_eq!(flat[10].span().end(), proc_macro2::LineColumn { line: 1, column: 21 });
if let Token::Delimiter(delimiter) = &flat[10] {
    assert_eq!(delimiter.kind(), DelimiterKind::Bracket);
    assert_eq!(delimiter.position(), DelimiterPosition::Close);
} else {
    panic!("expected delimiter");
}

功能

  • proc-macro: 启用proc-macro2proc-macro功能(默认启用)。
  • span-locations: 启用proc-macro2span-locations功能(默认启用)。

a bc

依赖

~60KB