-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
}
#![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));
+}