Skip to main content

rose_bitset_derive/
lib.rs

1extern crate proc_macro;
2extern crate proc_macro2;
3
4mod extras;
5mod impls;
6mod type_utils;
7
8use extras::Extras;
9use proc_macro::TokenStream;
10use proc_macro_error::{abort, proc_macro_error};
11use proc_macro2::TokenStream as TokenStream2;
12use syn::{DeriveInput, parse_macro_input, spanned::Spanned};
13
14#[proc_macro_error]
15#[proc_macro_derive(BitSet, attributes(bitset))]
16pub fn bitset_derive(input: TokenStream) -> TokenStream {
17    let DeriveInput {
18        attrs,
19        ident,
20        data,
21        generics,
22        ..
23    } = parse_macro_input!(input as DeriveInput);
24    if !generics.params.is_empty() {
25        abort!(
26            generics.span(), "unexpected generics";
27            note = "`BitSet` cannot be derived for generic types";
28        );
29    }
30    let uint = impls::main::get_uint(data);
31
32    let iter_impls = if let Some(bitset_attribute) = attrs
33        .iter()
34        .find(|attribute| attribute.meta.path().is_ident("bitset"))
35    {
36        Extras::generate_code_from_attribute(bitset_attribute, &ident, &uint)
37    } else {
38        TokenStream2::new()
39    };
40    let mut impls = impls::main::generate_code(ident, uint);
41    impls.extend(iter_impls);
42    impls.into()
43}