Lints and suggestions for the Nix programming language
at main 51 lines 1.3 kB view raw
1mod explain; 2mod metadata; 3mod test; 4 5use explain::generate_explain_impl; 6use metadata::{RawLintMeta, generate_meta_impl}; 7use proc_macro::TokenStream; 8use proc_macro2::TokenStream as TokenStream2; 9use quote::quote; 10use syn::{Ident, ItemStruct, parse_macro_input}; 11 12fn generate_self_impl(struct_name: &Ident) -> TokenStream2 { 13 quote! { 14 impl #struct_name { 15 pub fn new() -> Self { 16 Self 17 } 18 } 19 } 20} 21 22#[proc_macro_attribute] 23pub fn lint(attr: TokenStream, item: TokenStream) -> TokenStream { 24 let struct_item = parse_macro_input!(item as ItemStruct); 25 let meta = parse_macro_input!(attr as RawLintMeta); 26 27 let struct_name = &struct_item.ident; 28 let self_impl = generate_self_impl(struct_name); 29 let meta_impl = generate_meta_impl(struct_name, &meta); 30 let explain_impl = generate_explain_impl(&struct_item); 31 32 (quote! { 33 #struct_item 34 35 ::lazy_static::lazy_static! { 36 pub static ref LINT: Box<dyn crate::Lint> = Box::new(#struct_name::new()); 37 } 38 39 #self_impl 40 #meta_impl 41 #explain_impl 42 43 impl crate::Lint for #struct_name {} 44 }) 45 .into() 46} 47 48#[proc_macro] 49pub fn generate_tests(input: TokenStream) -> TokenStream { 50 crate::test::generate_tests(input) 51}