Upgrade rust/crates/proc-macro-hack to 0.5.18
Change-Id: I4e17bf83d28687a52026191a93e1768afc89f2ff
diff --git a/src/lib.rs b/src/lib.rs
index 16d7823..901a719 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -6,7 +6,13 @@
//!
//! <br>
//!
-//! As of Rust 1.30, the language supports user-defined function-like procedural
+//! <table><tr><td><hr>
+//! <b>Note:</b> <i>As of Rust 1.45 this crate is superseded by native support
+//! for #[proc_macro] in expression position. Only consider using this crate if
+//! you care about supporting compilers between 1.31 and 1.45.</i>
+//! <hr></td></tr></table>
+//!
+//! Since Rust 1.30, the language supports user-defined function-like procedural
//! macros. However these can only be invoked in item position, not in
//! statements or expressions.
//!
@@ -31,8 +37,8 @@
//! macros.
//!
//! ```
-//! extern crate proc_macro;
-//!
+//! # extern crate proc_macro;
+//! #
//! use proc_macro::TokenStream;
//! use proc_macro_hack::proc_macro_hack;
//! use quote::quote;
@@ -262,86 +268,111 @@
};
let from = export.from;
- let rules = export
- .macros
- .into_iter()
- .map(|Macro { name, export_as }| {
- let actual_name = actual_proc_macro_name(&name);
- let dispatch = dispatch_macro_name(&name);
- let call_site = call_site_macro_name(&name);
+ let mut actual_names = TokenStream::new();
+ let mut export_dispatch = TokenStream::new();
+ let mut export_call_site = TokenStream::new();
+ let mut macro_rules = TokenStream::new();
+ for Macro { name, export_as } in &export.macros {
+ let actual_name = actual_proc_macro_name(&name);
+ let dispatch = dispatch_macro_name(&name);
+ let call_site = call_site_macro_name(&name);
- let export_dispatch = if args.support_nested {
- quote! {
- #[doc(hidden)]
- #vis use proc_macro_nested::dispatch as #dispatch;
- }
- } else {
- quote!()
- };
+ if !actual_names.is_empty() {
+ actual_names.extend(quote!(,));
+ }
+ actual_names.extend(quote!(#actual_name));
- let proc_macro_call = if args.support_nested {
- let extra_bangs = (0..args.internal_macro_calls)
- .map(|_| TokenTree::Punct(Punct::new('!', Spacing::Alone)))
- .collect::<TokenStream>();
- quote! {
- #crate_prefix #dispatch! { ($($proc_macro)*) #extra_bangs }
- }
- } else {
- quote! {
- proc_macro_call!()
- }
- };
+ if !export_dispatch.is_empty() {
+ export_dispatch.extend(quote!(,));
+ }
+ export_dispatch.extend(quote!(dispatch as #dispatch));
- let export_call_site = if args.fake_call_site {
- quote! {
- #[doc(hidden)]
- #vis use proc_macro_hack::fake_call_site as #call_site;
- }
- } else {
- quote!()
- };
+ if !export_call_site.is_empty() {
+ export_call_site.extend(quote!(,));
+ }
+ export_call_site.extend(quote!(fake_call_site as #call_site));
- let do_derive = if !args.fake_call_site {
- quote! {
- #[derive(#crate_prefix #actual_name)]
- }
- } else if crate_prefix.is_some() {
- quote! {
- use #crate_prefix #actual_name;
- #[#crate_prefix #call_site ($($proc_macro)*)]
- #[derive(#actual_name)]
- }
- } else {
- quote! {
- #[#call_site ($($proc_macro)*)]
- #[derive(#actual_name)]
- }
- };
-
+ let do_derive = if !args.fake_call_site {
quote! {
- #[doc(hidden)]
- #vis use #from::#actual_name;
-
- #export_dispatch
- #export_call_site
-
- #attrs
- #macro_export
- macro_rules! #export_as {
- ($($proc_macro:tt)*) => {{
- #do_derive
- #[allow(dead_code)]
- enum ProcMacroHack {
- #enum_variant = (stringify! { $($proc_macro)* }, 0).1,
- }
- #proc_macro_call
- }};
- }
+ #[derive(#crate_prefix #actual_name)]
}
- })
- .collect();
+ } else if crate_prefix.is_some() {
+ quote! {
+ use #crate_prefix #actual_name;
+ #[#crate_prefix #call_site ($($proc_macro)*)]
+ #[derive(#actual_name)]
+ }
+ } else {
+ quote! {
+ #[#call_site ($($proc_macro)*)]
+ #[derive(#actual_name)]
+ }
+ };
- wrap_in_enum_hack(dummy, rules)
+ let proc_macro_call = if args.support_nested {
+ let extra_bangs = (0..args.internal_macro_calls)
+ .map(|_| TokenTree::Punct(Punct::new('!', Spacing::Alone)))
+ .collect::<TokenStream>();
+ quote! {
+ #crate_prefix #dispatch! { ($($proc_macro)*) #extra_bangs }
+ }
+ } else {
+ quote! {
+ proc_macro_call!()
+ }
+ };
+
+ macro_rules.extend(quote! {
+ #attrs
+ #macro_export
+ macro_rules! #export_as {
+ ($($proc_macro:tt)*) => {{
+ #do_derive
+ #[allow(dead_code)]
+ enum ProcMacroHack {
+ #enum_variant = (stringify! { $($proc_macro)* }, 0).1,
+ }
+ #proc_macro_call
+ }};
+ }
+ });
+ }
+
+ if export.macros.len() != 1 {
+ export_dispatch = quote!({#export_dispatch});
+ export_call_site = quote!({#export_call_site});
+ actual_names = quote!({#actual_names});
+ }
+
+ let export_dispatch = if args.support_nested {
+ quote! {
+ #[doc(hidden)]
+ #vis use proc_macro_nested::#export_dispatch;
+ }
+ } else {
+ quote!()
+ };
+
+ let export_call_site = if args.fake_call_site {
+ quote! {
+ #[doc(hidden)]
+ #vis use proc_macro_hack::#export_call_site;
+ }
+ } else {
+ quote!()
+ };
+
+ let expanded = quote! {
+ #[doc(hidden)]
+ #vis use #from::#actual_names;
+
+ #export_dispatch
+ #export_call_site
+
+ #macro_rules
+ };
+
+ wrap_in_enum_hack(dummy, expanded)
}
fn expand_define(define: Define) -> TokenStream {