rose_bitset_derive/
lib.rs1extern 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}