From 97e5e62b03c45c0f8a587fb1ca06b64d95df78e9 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 6 May 2024 19:17:31 +0100 Subject: [PATCH] REPRO --- Cargo.lock | 1 + macros/Cargo.toml | 1 + macros/macros.rs | 32 ++++++++++++++++++++++++-------- src/main.rs | 23 ++++++++++++++++++----- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fceca33..d5c0119 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,7 @@ name = "foo-macros" version = "0.1.0" dependencies = [ "proc-macro2", + "quote", "syn", ] diff --git a/macros/Cargo.toml b/macros/Cargo.toml index 78cd50d..5e65c89 100644 --- a/macros/Cargo.toml +++ b/macros/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [dependencies] syn = "2" proc-macro2 = "1" +quote = "1" [lib] path = "macros.rs" diff --git a/macros/macros.rs b/macros/macros.rs index ad774d0..1c4f685 100644 --- a/macros/macros.rs +++ b/macros/macros.rs @@ -1,11 +1,27 @@ -use proc_macro2::TokenStream as TokenStream2; +use proc_macro::TokenStream; +use quote::{quote, ToTokens}; +use proc_macro2::Delimiter; #[proc_macro] -pub fn reparse(input: proc_macro::TokenStream) -> proc_macro::TokenStream { - let input: TokenStream2 = input.into(); - let input: syn::LitStr = syn::parse2(input).expect("not litstr?"); - let reparsed: TokenStream2 = input.parse().unwrap_or_else(|e| { - e.into_compile_error() - }); - reparsed.into() +pub fn dbg_dump(input: TokenStream) -> TokenStream { + dbg!(&input); + input +} + +#[proc_macro] +pub fn define_struct_procmacro(input: TokenStream) -> TokenStream { + let ty: syn::Type = syn::parse(input).unwrap(); + let ty = proc_macro2::Group::new( + Delimiter::None, + ty.to_token_stream(), + ); + let out: TokenStream = quote! { + struct FromProcMacro { + field: &'static #ty, + } + }.into(); + + dbg!(&out); + + out } diff --git a/src/main.rs b/src/main.rs index 89ed347..d496be6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,19 @@ -use foo_macros::reparse; +#![allow(dead_code)] -fn main() { - let s = reparse!(" { "); - println!("{s:?}"); -} +use foo_macros::*; + +use std::fmt::Display; + +macro_rules! define_struct_pattern { { $ftype:ty } => { + foo_macros::dbg_dump! { + struct FromPatternMacro { + field: &'static $ftype, + } + } +} } + +define_struct_pattern!{ dyn Display + 'static } + +define_struct_procmacro!{ dyn Display + 'static } + +fn main() {} -- 2.30.2