chiark / gitweb /
config, wip macro, spans
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 24 Jul 2021 11:51:13 +0000 (12:51 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 24 Jul 2021 11:51:50 +0000 (12:51 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
macros/macros.rs

index bbdb99fc88b96c16b9830345c7737311533ca49f..d0045f5f5fa163dbab1d76e16ab1cf8ad91416ad 100644 (file)
@@ -32,10 +32,11 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
   let mut names = vec![];
   let mut output = vec![];
   for field in &fields.named {
-    let fname = &field.ident;
     dbg!(field);
-    let mut skl = quote!{ SectionKindList::Ordinary };
-    let mut method = quote!{ ordinary };
+    let fname = &field.ident.as_ref().unwrap();
+    let fname_span = fname.span();
+    let mut skl = quote_spanned!{fname_span=> SectionKindList::Ordinary };
+    let mut method = quote_spanned!{fname_span=> ordinary };
     for attr in &field.attrs {
       if attr.tokens.is_empty() {
         let atspan = attr.path.segments.last().unwrap().ident.span();
@@ -59,22 +60,24 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
         skl    = get_path(tskl);
       }
     }
-    let fname_string = fname.as_ref().unwrap().to_string();
+    let fname_string = fname.to_string();
     let fname_lit = Literal::string( &fname_string );
 
     names.push(quote!{
       (#fname_lit, #skl),
     });
-    output.push(quote_spanned!{fname.as_ref().unwrap().span()=>
+    dbg!(&method);
+    output.push(quote!{
       #fname: rctx. #method ( #fname_lit )?,
     });
     eprintln!("{:?} method={:?} skl={:?}", field.ident, method, skl);
   }
+  dbg!(&output);
 
   let output = quote! {
     impl #target {
       const FIELDS: &'static [(&'static str, SectionKindList)]
-        = &[ #( #names ),* ];
+        = &[ #( #names )* ];
 
       fn resolve_instance(rctx: &ResolveContext)
           -> ::std::result::Result<#target, anyhow::Error>