chiark / gitweb /
REPRO
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 6 May 2024 18:17:31 +0000 (19:17 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 6 May 2024 18:17:31 +0000 (19:17 +0100)
Cargo.lock
macros/Cargo.toml
macros/macros.rs
src/main.rs

index fceca3338d76d719d936918aca83ab7b1bc89005..d5c0119e1798fb47f8c3139a296e12a595922916 100644 (file)
@@ -14,6 +14,7 @@ name = "foo-macros"
 version = "0.1.0"
 dependencies = [
  "proc-macro2",
+ "quote",
  "syn",
 ]
 
index 78cd50de3435bbab3be05f7d7a392a1b369fc4ef..5e65c8948fe8ec5bfb558e40c3bd25deab88a616 100644 (file)
@@ -7,6 +7,7 @@ edition = "2021"
 [dependencies]
 syn = "2"
 proc-macro2 = "1"
+quote = "1"
 
 [lib]
 path = "macros.rs"
index ad774d048575faf90331e0674050559596b87bd7..1c4f68569b31ca92d39afd800e71bfd365a8bbd4 100644 (file)
@@ -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
 }
index 89ed347d446ff2361c3b39d6126f0679991d4cc1..d496be67e0c3541e36db8f6e326883b37118b10b 100644 (file)
@@ -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() {}