• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..--

build/25-Apr-2025-2211

src/25-Apr-2025-4,7573,603

tests/25-Apr-2025-1,047906

.cargo-checksum.jsonD25-Apr-20251.9 KiB11

Android.bpD25-Apr-20255 KiB229218

Cargo.tomlD25-Apr-20251.6 KiB6859

LICENSED25-Apr-20259.5 KiB177150

LICENSE-APACHED25-Apr-20259.5 KiB177150

LICENSE-MITD25-Apr-20251,023 2421

METADATAD25-Apr-2025489 1817

MODULE_LICENSE_APACHE2D25-Apr-20250

README.mdD25-Apr-20253.8 KiB9569

TEST_MAPPINGD25-Apr-20254.2 KiB187186

build.rsD25-Apr-20256.7 KiB203119

cargo_embargo.jsonD25-Apr-2025219 1514

rules.mkD25-Apr-2025685 2416

rust-toolchain.tomlD25-Apr-202538 32

README.md

1# proc-macro2
2
3[<img alt="github" src="https://img.shields.io/badge/github-dtolnay/proc--macro2-8da0cb?style=for-the-badge&labelColor=555555&logo=github" height="20">](https://github.com/dtolnay/proc-macro2)
4[<img alt="crates.io" src="https://img.shields.io/crates/v/proc-macro2.svg?style=for-the-badge&color=fc8d62&logo=rust" height="20">](https://crates.io/crates/proc-macro2)
5[<img alt="docs.rs" src="https://img.shields.io/badge/docs.rs-proc--macro2-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs" height="20">](https://docs.rs/proc-macro2)
6[<img alt="build status" src="https://img.shields.io/github/actions/workflow/status/dtolnay/proc-macro2/ci.yml?branch=master&style=for-the-badge" height="20">](https://github.com/dtolnay/proc-macro2/actions?query=branch%3Amaster)
7
8A wrapper around the procedural macro API of the compiler's `proc_macro` crate.
9This library serves two purposes:
10
11- **Bring proc-macro-like functionality to other contexts like build.rs and
12  main.rs.** Types from `proc_macro` are entirely specific to procedural macros
13  and cannot ever exist in code outside of a procedural macro. Meanwhile
14  `proc_macro2` types may exist anywhere including non-macro code. By developing
15  foundational libraries like [syn] and [quote] against `proc_macro2` rather
16  than `proc_macro`, the procedural macro ecosystem becomes easily applicable to
17  many other use cases and we avoid reimplementing non-macro equivalents of
18  those libraries.
19
20- **Make procedural macros unit testable.** As a consequence of being specific
21  to procedural macros, nothing that uses `proc_macro` can be executed from a
22  unit test. In order for helper libraries or components of a macro to be
23  testable in isolation, they must be implemented using `proc_macro2`.
24
25[syn]: https://github.com/dtolnay/syn
26[quote]: https://github.com/dtolnay/quote
27
28## Usage
29
30```toml
31[dependencies]
32proc-macro2 = "1.0"
33```
34
35The skeleton of a typical procedural macro typically looks like this:
36
37```rust
38extern crate proc_macro;
39
40#[proc_macro_derive(MyDerive)]
41pub fn my_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
42    let input = proc_macro2::TokenStream::from(input);
43
44    let output: proc_macro2::TokenStream = {
45        /* transform input */
46    };
47
48    proc_macro::TokenStream::from(output)
49}
50```
51
52If parsing with [Syn], you'll use [`parse_macro_input!`] instead to propagate
53parse errors correctly back to the compiler when parsing fails.
54
55[`parse_macro_input!`]: https://docs.rs/syn/2.0/syn/macro.parse_macro_input.html
56
57## Unstable features
58
59The default feature set of proc-macro2 tracks the most recent stable compiler
60API. Functionality in `proc_macro` that is not yet stable is not exposed by
61proc-macro2 by default.
62
63To opt into the additional APIs available in the most recent nightly compiler,
64the `procmacro2_semver_exempt` config flag must be passed to rustc. We will
65polyfill those nightly-only APIs back to Rust 1.56.0. As these are unstable APIs
66that track the nightly compiler, minor versions of proc-macro2 may make breaking
67changes to them at any time.
68
69```
70RUSTFLAGS='--cfg procmacro2_semver_exempt' cargo build
71```
72
73Note that this must not only be done for your crate, but for any crate that
74depends on your crate. This infectious nature is intentional, as it serves as a
75reminder that you are outside of the normal semver guarantees.
76
77Semver exempt methods are marked as such in the proc-macro2 documentation.
78
79<br>
80
81#### License
82
83<sup>
84Licensed under either of <a href="LICENSE-APACHE">Apache License, Version
852.0</a> or <a href="LICENSE-MIT">MIT license</a> at your option.
86</sup>
87
88<br>
89
90<sub>
91Unless you explicitly state otherwise, any contribution intentionally submitted
92for inclusion in this crate by you, as defined in the Apache-2.0 license, shall
93be dual licensed as above, without any additional terms or conditions.
94</sub>
95