Lints and suggestions for the Nix programming language
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}