TedDriggs / darling

A Rust proc-macro attribute parser
MIT License
983 stars 66 forks source link

Can this library analyze #[cfg(feature = "test")] #300

Closed oligamiq closed 1 month ago

oligamiq commented 1 month ago

I may receive #[cfg(feature = "test")]

But this code failed:

let attr_args = match NestedMeta::parse_meta_list(attr.into()) {
    Ok(v) => v,
    Err(e) => { return Err(e); }
};
error: expected identifier or literal
  --> crates\test_code\src\setting.rs:24:30
   |
24 | #[const_compat(test_setting, #[cfg(feature = "test")])]
   |                      
oligamiq commented 1 month ago

I made new logic, so to close.

enum ConstCompatAttr {
    Ident(Ident),
    Attribute(Vec<Attribute>),
}

impl Parse for ConstCompatAttr {
    fn parse(input: syn::parse::ParseStream<'_>) -> syn::Result<Self> {
        match input.parse::<syn::Ident>() {
            Ok(meta) => Ok(ConstCompatAttr::Ident(meta)),
            Err(_) => Ok(ConstCompatAttr::Attribute(input.call(Attribute::parse_outer)?)),
        }
    }
}

#[proc_macro_attribute]
pub fn const_compat(attr: TokenStream, item: TokenStream) -> TokenStream {
    let attr = syn::punctuated::Punctuated::<ConstCompatAttr, Token![,]>::parse_terminated.parse(attr)?;
}