proc-macro-nested-0.1.3/build.rs010066400017500001750000000015021342542111300147170ustar0000000000000000use std::env; use std::fs::File; use std::io::Write; use std::iter; use std::path::Path; /* #[doc(hidden)] #[macro_export] macro_rules! count { () => { proc_macro_call_0!() }; (!) => { proc_macro_call_1!() }; (!!) => { proc_macro_call_2!() }; ... } */ fn main() { let out_dir = env::var("OUT_DIR").unwrap(); let dest_path = Path::new(&out_dir).join("count.rs"); let mut f = File::create(&dest_path).unwrap(); let mut content = String::new(); content += " #[doc(hidden)] #[macro_export] macro_rules! count { "; for i in 0..=64 { let bangs = iter::repeat("!").take(i).collect::(); content += &format!("({}) => {{ proc_macro_call_{}!() }};", bangs, i); } content += " } "; f.write_all(content.as_bytes()).unwrap(); } proc-macro-nested-0.1.3/Cargo.toml.orig010066400017500001750000000003721343762307200161600ustar0000000000000000[package] name = "proc-macro-nested" version = "0.1.3" authors = ["David Tolnay "] license = "MIT/Apache-2.0" description = "Support for nested proc-macro-hack invocations" repository = "https://github.com/dtolnay/proc-macro-hack" proc-macro-nested-0.1.3/Cargo.toml0000644000000014070000000000000124160ustar00# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're # editing this file be aware that the upstream Cargo.toml # will likely look very different (and much more reasonable) [package] name = "proc-macro-nested" version = "0.1.3" authors = ["David Tolnay "] description = "Support for nested proc-macro-hack invocations" license = "MIT/Apache-2.0" repository = "https://github.com/dtolnay/proc-macro-hack" proc-macro-nested-0.1.3/src/lib.rs010064400017500001750000000041421343762276000151740ustar0000000000000000//! Support for nested invocations of proc-macro-hack expression macros. //! //! By default, macros defined through proc-macro-hack do not support nested //! invocations, i.e. the code emitted by a proc-macro-hack macro invocation //! cannot contain recursive calls to the same proc-macro-hack macro nor calls //! to any other proc-macro-hack macros. //! //! This crate provides opt-in support for such nested invocations. //! //! To make a macro callable recursively, add a dependency on this crate from //! your declaration crate and update the `#[proc_macro_hack]` re-export as //! follows. //! //! ```rust //! // Before //! # const IGNORE: &str = stringify! { //! #[proc_macro_hack] //! pub use demo_hack_impl::add_one; //! # } //! ``` //! //! ```rust //! // After //! # const IGNORE: &str = stringify! { //! #[proc_macro_hack(support_nested)] //! pub use demo_hack_impl::add_one; //! # } //! ``` //! //! No change is required within your definition crate, only to the re-export in //! the declaration crate. //! //! # Limitations //! //! - Nested invocations are preprocessed by a TT-muncher, so the caller's crate //! will be required to contain `#![recursion_limit = "..."]` if there are //! lengthy macro invocations. //! //! - Only up to 64 nested invocations are supported. #![no_std] include!(concat!(env!("OUT_DIR"), "/count.rs")); #[doc(hidden)] #[macro_export] macro_rules! dispatch { (() $($bang:tt)*) => { $crate::count!($($bang)*) }; ((($($first:tt)*) $($rest:tt)*) $($bang:tt)*) => { $crate::dispatch!(($($first)* $($rest)*) $($bang)*) }; (([$($first:tt)*] $($rest:tt)*) $($bang:tt)*) => { $crate::dispatch!(($($first)* $($rest)*) $($bang)*) }; (({$($first:tt)*} $($rest:tt)*) $($bang:tt)*) => { $crate::dispatch!(($($first)* $($rest)*) $($bang)*) }; ((! $($rest:tt)*) $($bang:tt)*) => { $crate::dispatch!(($($rest)*) $($bang)* !) }; ((!= $($rest:tt)*) $($bang:tt)*) => { $crate::dispatch!(($($rest)*) $($bang)* !) }; (($first:tt $($rest:tt)*) $($bang:tt)*) => { $crate::dispatch!(($($rest)*) $($bang)*) }; } proc-macro-nested-0.1.3/.cargo_vcs_info.json0000644000000001120000000000000144100ustar00{ "git": { "sha1": "0ea108743cceb4e3f917ff85f7f27818d6fafafc" } }