#proc-macro #build #compiler #outside #quote #syn

proc-macro2-fallback

仅适用于proc-macro2包的非libproc_macro代码路径

1个稳定版本

1.0.66 2023年7月17日

#630过程宏

MIT/Apache

140KB
3.5K SLoC

proc-macro2

github crates.io docs.rs build status

编译器 proc_macro 包的过程宏API的包装器。这个库有两个作用

  • 将过程宏功能引入其他上下文,如build.rs和main.rs。 来自 proc_macro 的类型完全特定于过程宏,并且永远不会存在于过程宏之外。与此同时,proc_macro2 的类型可以存在于任何地方,包括非宏代码。通过针对 proc_macro2 而不是 proc_macro 开发基础库,如 synquote,过程宏生态系统可以轻松应用于许多其他用例,我们避免了重新实现这些库的非宏等价物。

  • 使过程宏可单元测试。 由于其特定于过程宏,因此使用 proc_macro 的任何内容都无法从单元测试中执行。为了使辅助库或宏的组件可以独立测试,它们必须使用 proc_macro2 实现。

用法

[dependencies]
proc-macro2 = "1.0"

典型的过程宏骨架通常如下所示

extern crate proc_macro;

#[proc_macro_derive(MyDerive)]
pub fn my_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    let input = proc_macro2::TokenStream::from(input);

    let output: proc_macro2::TokenStream = {
        /* transform input */
    };

    proc_macro::TokenStream::from(output)
}

如果使用 Syn 进行解析,您将使用 parse_macro_input! 代替,以在解析失败时正确地将解析错误传播回编译器。

不稳定的功能

proc-macro2的默认功能集跟踪最新的稳定编译器API。在 proc_macro 中尚未稳定的功能默认情况下不会由proc-macro2公开。

要选择最最新夜间编译器中可用的附加API,必须将 procmacro2_semver_exempt 配置标志传递给rustc。我们将用这些夜间-only API填充Rust 1.56.0。由于这些是跟踪夜间编译器的非稳定API,proc-macro2的较小版本可能会在任何时候对这些API进行破坏性更改。

RUSTFLAGS='--cfg procmacro2_semver_exempt' cargo build

请注意,这不仅要针对您的包执行,还要针对任何依赖您的包的包。这种传染性是有意为之的,因为它提醒您您已经超出了正常的semver保证。

在 proc-macro2 文档中,Semver 免除方法被标记为如此。


许可证

根据您的要求,许可协议可以是 Apache License, Version 2.0MIT 许可证
除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交给本仓库的任何贡献,都应如上所述双重许可,不附加任何额外条款或条件。

依赖关系