#proc-macro #macro #syn

proc-macro2

编译器 proc_macro API 的替代实现,以解耦基于标记的库与进程宏用例

140 个版本 (85 个稳定版)

1.0.86 2024年6月21日
1.0.84 2024年5月25日
1.0.79 2024年3月12日
1.0.72 2023年12月31日
0.1.2 2017年7月14日

#4进程宏

Download history 3621348/week @ 2024-05-04 3661573/week @ 2024-05-11 3805749/week @ 2024-05-18 3683207/week @ 2024-05-25 3963019/week @ 2024-06-01 3954270/week @ 2024-06-08 3835554/week @ 2024-06-15 3925926/week @ 2024-06-22 3542757/week @ 2024-06-29 3961716/week @ 2024-07-06 3929669/week @ 2024-07-13 3994748/week @ 2024-07-20 4043997/week @ 2024-07-27 4106323/week @ 2024-08-03 4340742/week @ 2024-08-10 3546710/week @ 2024-08-17

每月下载量16,689,730
用于 99,612 个crate (7,559 直接)

MIT/Apache

170KB
4K SLoC

proc-macro2

github crates.io docs.rs build status

编译器进程宏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。我们将使用polyfill将这些夜间仅有的API回填到Rust 1.56.0。由于这些是不稳定的API,它们跟踪夜间编译器,proc-macro2的次要版本可能在任何时候对它们进行破坏性更改。

RUSTFLAGS='--cfg procmacro2_semver_exempt' cargo build

请注意,这不仅仅要对您的crate做,还要对任何依赖于您的crate的crate做。这种传染性是有意为之的,因为它提醒您您不在正常的semver保证范围内。

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


许可证

您可以选择根据Apache License,版本2.0MIT许可证进行许可。
除非您明确表示,否则,您提交给此crate的任何有意包含的贡献,根据Apache-2.0许可证定义,应作为上述双重许可,而不附加任何额外条款或条件。

依赖项