From 3b5607ecdc772f9f30d572b436f66c222862b8c2 Mon Sep 17 00:00:00 2001 From: Jason Volk <jason@zemos.net> Date: Fri, 26 Jul 2024 06:41:26 +0000 Subject: [PATCH] add macro for out-of-line definitions Signed-off-by: Jason Volk <jason@zemos.net> --- src/macros/implement.rs | 23 +++++++++++++++++++++++ src/macros/mod.rs | 4 ++++ 2 files changed, 27 insertions(+) create mode 100644 src/macros/implement.rs diff --git a/src/macros/implement.rs b/src/macros/implement.rs new file mode 100644 index 000000000..1a06e588c --- /dev/null +++ b/src/macros/implement.rs @@ -0,0 +1,23 @@ +use proc_macro::TokenStream; +use quote::{quote, ToTokens}; +use syn::{parse_macro_input, AttributeArgs, ItemFn, Meta, NestedMeta}; + +pub(super) fn implement(args: TokenStream, input: TokenStream) -> TokenStream { + let args = parse_macro_input!(args as AttributeArgs); + let item = parse_macro_input!(input as ItemFn); + + let NestedMeta::Meta(Meta::Path(receiver)) = args + .first() + .expect("missing path to trait or item to implement") + else { + panic!("invalid path to item for implement"); + }; + + let out = quote! { + impl #receiver { + #item + } + }; + + out.into_token_stream().into() +} diff --git a/src/macros/mod.rs b/src/macros/mod.rs index a0e61324a..8d7e2e5b7 100644 --- a/src/macros/mod.rs +++ b/src/macros/mod.rs @@ -1,6 +1,7 @@ mod admin; mod cargo; mod debug; +mod implement; mod refutable; mod rustc; mod utils; @@ -23,3 +24,6 @@ pub fn rustc_flags_capture(args: TokenStream) -> TokenStream { rustc::flags_capt #[proc_macro_attribute] pub fn refutable(args: TokenStream, input: TokenStream) -> TokenStream { refutable::refutable(args, input) } + +#[proc_macro_attribute] +pub fn implement(args: TokenStream, input: TokenStream) -> TokenStream { implement::implement(args, input) } -- GitLab