From 0d8b9f02afc86620ab0baf3fc1883ae599247b1e Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 27 Feb 2017 16:23:04 -0800 Subject: [PATCH] Pub use impl::* to avoid two dependencies --- Cargo.toml | 5 ++++- README.md | 28 ++++++++++++++-------------- demo-hack-impl/Cargo.toml | 5 ++--- demo-hack-impl/src/lib.rs | 4 ++-- demo-hack/Cargo.toml | 6 +++--- demo-hack/src/lib.rs | 8 ++++++-- example/Cargo.toml | 2 -- example/src/main.rs | 1 - impl/Cargo.toml | 2 +- impl/src/lib.rs | 8 -------- src/lib.rs | 12 ++++-------- 11 files changed, 36 insertions(+), 45 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6a6c22d..9883a32 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "proc-macro-hack" -version = "0.2.4" +version = "0.3.0" authors = ["David Tolnay "] license = "MIT/Apache-2.0" description = "Procedural functionlike!() macros using only Macros 1.1" repository = "https://github.com/dtolnay/proc-macro-hack" + +[dependencies] +proc-macro-hack-impl = { version = "0.3", path = "impl" } diff --git a/README.md b/README.md index d5e87db..3a1998d 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,12 @@ traits or functions or ordinary macros. https://github.com/dtolnay/proc-macro-hack/tree/master/demo-hack ```rust -#[macro_use] extern crate proc_macro_hack; -#[macro_use] extern crate proc_macro_hack_impl; +#[macro_use] +extern crate proc_macro_hack; + +#[macro_use] +extern crate demo_hack_impl; +pub use demo_hack_impl::*; /// Add one to an expression. proc_macro_expr_decl!(add_one! => add_one_impl); @@ -43,8 +47,8 @@ and private modules are fine but nothing can be public. https://github.com/dtolnay/proc-macro-hack/tree/master/demo-hack-impl ```rust -#[macro_use] extern crate proc_macro_hack; -#[macro_use] extern crate proc_macro_hack_impl; +#[macro_use] +extern crate proc_macro_hack; proc_macro_expr_impl! { /// Add one to an expression. @@ -61,13 +65,11 @@ proc_macro_item_impl! { } ``` -Both crates depend on `proc-macro-hack` which itself has a declaration crate and -implementation crate: +Both crates depend on `proc-macro-hack`: ```toml [dependencies] -proc-macro-hack = "0.2" -proc-macro-hack-impl = "0.2" +proc-macro-hack = "0.3" ``` Additionally, your implementation crate (but not your declaration crate) is a @@ -80,15 +82,15 @@ proc-macro = true ## Using procedural macros -Users of your crate depend on your declaration crate and implementation crate, -then use your procedural macros as though it were magic. They even get +Users of your crate depend on your declaration crate (not your implementation +crate), then use your procedural macros as though it were magic. They even get reasonable error messages if your procedural macro panics. https://github.com/dtolnay/proc-macro-hack/tree/master/example ```rust -#[macro_use] extern crate demo_hack; -#[macro_use] extern crate demo_hack_impl; +#[macro_use] +extern crate demo_hack; two_fn!(two); @@ -102,8 +104,6 @@ fn main() { ## Limitations - The input to your macro cannot contain dollar signs. -- Users of your macro need to `#[macro_use] extern crate` two different crates, - not just one. - Your macro must expand to either an expression or zero-or-more items, cannot sometimes be one or the other depending on input. diff --git a/demo-hack-impl/Cargo.toml b/demo-hack-impl/Cargo.toml index 4f3ada6..57c1b2e 100644 --- a/demo-hack-impl/Cargo.toml +++ b/demo-hack-impl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "demo-hack-impl" -version = "0.0.1" +version = "0.0.2" authors = ["David Tolnay "] license = "MIT/Apache-2.0" description = "Demo of proc-macro-hack" @@ -10,5 +10,4 @@ repository = "https://github.com/dtolnay/proc-macro-hack" proc-macro = true [dependencies] -proc-macro-hack = { version = "0.2", path = ".." } -proc-macro-hack-impl = { version = "0.2", path = "../impl" } +proc-macro-hack = { version = "0.3", path = ".." } diff --git a/demo-hack-impl/src/lib.rs b/demo-hack-impl/src/lib.rs index b7a51ff..5552a6b 100644 --- a/demo-hack-impl/src/lib.rs +++ b/demo-hack-impl/src/lib.rs @@ -1,5 +1,5 @@ -#[macro_use] extern crate proc_macro_hack; -#[macro_use] extern crate proc_macro_hack_impl; +#[macro_use] +extern crate proc_macro_hack; proc_macro_expr_impl! { /// Add one to an expression. diff --git a/demo-hack/Cargo.toml b/demo-hack/Cargo.toml index 407b9a3..1c36826 100644 --- a/demo-hack/Cargo.toml +++ b/demo-hack/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "demo-hack" -version = "0.0.1" +version = "0.0.2" authors = ["David Tolnay "] license = "MIT/Apache-2.0" description = "Demo of proc-macro-hack" repository = "https://github.com/dtolnay/proc-macro-hack" [dependencies] -proc-macro-hack = { version = "0.2", path = ".." } -proc-macro-hack-impl = { version = "0.2", path = "../impl" } +proc-macro-hack = { version = "0.3", path = ".." } +demo-hack-impl = { version = "0.0.2", path = "../demo-hack-impl" } diff --git a/demo-hack/src/lib.rs b/demo-hack/src/lib.rs index c46c74f..53e99e9 100644 --- a/demo-hack/src/lib.rs +++ b/demo-hack/src/lib.rs @@ -1,5 +1,9 @@ -#[macro_use] extern crate proc_macro_hack; -#[macro_use] extern crate proc_macro_hack_impl; +#[macro_use] +extern crate proc_macro_hack; + +#[macro_use] +extern crate demo_hack_impl; +pub use demo_hack_impl::*; /// Add one to an expression. proc_macro_expr_decl!(add_one! => add_one_impl); diff --git a/example/Cargo.toml b/example/Cargo.toml index 6700091..d1998d6 100644 --- a/example/Cargo.toml +++ b/example/Cargo.toml @@ -6,5 +6,3 @@ publish = false [dependencies] demo-hack = { path = "../demo-hack" } -demo-hack-impl = { path = "../demo-hack-impl" } -proc-macro-hack = { path = ".." } diff --git a/example/src/main.rs b/example/src/main.rs index defd8ac..780d21b 100644 --- a/example/src/main.rs +++ b/example/src/main.rs @@ -1,5 +1,4 @@ #[macro_use] extern crate demo_hack; -#[macro_use] extern crate demo_hack_impl; two_fn!(two); diff --git a/impl/Cargo.toml b/impl/Cargo.toml index 6abeebc..d737fad 100644 --- a/impl/Cargo.toml +++ b/impl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "proc-macro-hack-impl" -version = "0.2.4" +version = "0.3.0" authors = ["David Tolnay "] license = "MIT/Apache-2.0" description = "Procedural functionlike!() macros using only Macros 1.1" diff --git a/impl/src/lib.rs b/impl/src/lib.rs index 14e5e94..6a6d3f6 100644 --- a/impl/src/lib.rs +++ b/impl/src/lib.rs @@ -3,10 +3,6 @@ use proc_macro::TokenStream; #[proc_macro_derive(ProcMacroHackExpr)] pub fn hack_expr(input: TokenStream) -> TokenStream { - if input.to_string().trim() == "struct Ignored;" { - return "".parse().unwrap(); - } - let (name, name_impl) = names(input); let rules = format!(" @@ -29,10 +25,6 @@ pub fn hack_expr(input: TokenStream) -> TokenStream { #[proc_macro_derive(ProcMacroHackItem)] pub fn hack_item(input: TokenStream) -> TokenStream { - if input.to_string().trim() == "struct Ignored;" { - return "".parse().unwrap(); - } - let (name, name_impl) = names(input); let rules = format!(" diff --git a/src/lib.rs b/src/lib.rs index 022b7ca..ee69fe0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,9 @@ extern crate proc_macro; +#[macro_use] +extern crate proc_macro_hack_impl; +pub use proc_macro_hack_impl::*; + #[doc(hidden)] pub use proc_macro::TokenStream; @@ -35,10 +39,6 @@ macro_rules! proc_macro_expr_impl { $( #[$attr] )* #[proc_macro_derive($func)] pub fn $func(input: $crate::TokenStream) -> $crate::TokenStream { - #[derive(ProcMacroHackExpr)] - struct Ignored; - let _ = Ignored; - let source = input.to_string(); let source = source.trim(); @@ -74,10 +74,6 @@ macro_rules! proc_macro_item_impl { $( #[$attr] )* #[proc_macro_derive($func)] pub fn $func(input: $crate::TokenStream) -> $crate::TokenStream { - #[derive(ProcMacroHackItem)] - struct Ignored; - let _ = Ignored; - let source = input.to_string(); let source = source.trim();