From 136a51fd9b002e45405738b66e64040c2ffb2688 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 10 May 2024 13:32:19 +0100 Subject: [PATCH] W --- macros/macros.rs | 40 +++++++++++++++++++--------------------- src/main.rs | 26 ++++++++++++++------------ 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/macros/macros.rs b/macros/macros.rs index 81489d1..70d8da7 100644 --- a/macros/macros.rs +++ b/macros/macros.rs @@ -1,30 +1,28 @@ -use proc_macro::TokenStream; -use quote::{quote, ToTokens}; -use proc_macro2::Delimiter; +use proc_macro::{Group, TokenStream, TokenTree}; #[proc_macro] pub fn dbg_dump(input: TokenStream) -> TokenStream { dbg!(&input); -dbg!(input.to_string()); + dbg!(input.to_string()); 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); - -dbg!(out.to_string()); - - out +pub fn reconstruct_group(input: TokenStream) -> TokenStream { + let mut output = TokenStream::new(); + dbg!(&input); + for tt in input { + let tt = match tt { + TokenTree::Group(g) => { + let delim = g.delimiter(); + dbg!(&delim); + TokenTree::Group(Group::new(delim, g.stream())) + }, + other => other, + }; + output.extend([tt]); + } + dbg!(&output); + dbg!(&output.to_string()); + output } diff --git a/src/main.rs b/src/main.rs index 89c7329..2dbd8ed 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,19 @@ #![allow(dead_code)] use foo_macros::*; -use std::fmt::Display; -macro_rules! define_struct_pattern { { $ftype:ty } => { - foo_macros::dbg_dump! { - struct FromPatternMacro { - field: &'static $ftype, - } - } +macro_rules! one_plus { { $v:expr } => { + 1 + $v +} } +macro_rules! one_plus_dbg { { $v:expr } => { + dbg_dump!(1 + $v) +} } +macro_rules! one_plus_reconstruct { { $v:expr } => { + dbg_dump!(1 + reconstruct_group!($v)) } } -define_struct_pattern!{ dyn Display + 'static } - -define_struct_procmacro!{ dyn Display + 'static } - -fn main() {} +fn main() { + println!("1 + (2<<3) should be 17"); +// println!("{} without proc_macro", one_plus!(2 << 3)); +// println!("{} dbg_dump", one_plus_dbg!(2 << 3)); + println!("{} reconstruct", one_plus_reconstruct!(2 << 3)); +} -- 2.30.2