-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
}
-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() {}