我认为程序宏只需要具有词法有效的输入,但似乎所有输入也必须解析为 Rust 代码,除非我做错了什么。
RFC 说:
通过对标记进行操作,传递给过程宏的代码不需要满足 Rust 解析器,只需要满足词法分析器。
一旦输入涉及无效的 Rust 语法,我就会得到解析错误。
考虑以下过程宏:
#[proc_macro_attribute]
pub fn my_macro(_: TokenStream, _: TokenStream) -> TokenStream {
TokenStream::from(quote! {})
}
运行时:
#[my_macro]
fn test() { * } // lexically valid but syntactically invalid
我得到错误:
error: expected expression, found `}`
--> blah.rs:38:2
|
33 | #[logic] fn omg () { * }
| ^ expected expression
cargo-expand
表明宏正确地删除了函数。它不应该因此停止任何解析错误吗?
我究竟做错了什么?