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