modular_bitfield_impl/
lib.rs1#![recursion_limit = "256"]
2#![forbid(unsafe_code)]
3#![warn(clippy::pedantic, rust_2018_idioms)]
4
5#[macro_use]
6mod errors;
7mod bitfield;
8mod bitfield_specifier;
9mod define_specifiers;
10
11use proc_macro::TokenStream;
12
13#[proc_macro]
17pub fn define_specifiers(input: TokenStream) -> TokenStream {
18 define_specifiers::generate(input.into()).into()
19}
20
21#[proc_macro_attribute]
22pub fn bitfield(args: TokenStream, input: TokenStream) -> TokenStream {
23 bitfield::analyse_and_expand(args.into(), input.into()).into()
24}
25
26#[proc_macro_derive(Specifier, attributes(bits))]
27pub fn specifier(input: TokenStream) -> TokenStream {
28 bitfield_specifier::generate(input.into()).into()
29}
30
31#[deprecated(
32 since = "0.12.0",
33 note = "use #[derive(Specifier)]. This alias will be removed in 0.13."
34)]
35#[proc_macro_derive(BitfieldSpecifier, attributes(bits))]
36pub fn bitfield_specifier(input: TokenStream) -> TokenStream {
37 bitfield_specifier::generate(input.into()).into()
38}
39
40#[cfg(coverage)]
41#[test]
42fn ui_code_coverage() {
43 use runtime_macros::{emulate_attributelike_macro_expansion, emulate_derive_macro_expansion};
44 use std::fs::File;
45
46 let mut run_success = true;
47 for entry in glob::glob("../tests/ui/**/*.rs").unwrap() {
48 let entry = entry.unwrap();
49 run_success &= emulate_attributelike_macro_expansion(
50 File::open(entry.as_path()).unwrap(),
51 &[("bitfield", bitfield::analyse_and_expand)],
52 )
53 .is_ok();
54 run_success &= emulate_derive_macro_expansion(
55 File::open(entry.as_path()).unwrap(),
56 &[("Specifier", bitfield_specifier::generate)],
57 )
58 .is_ok();
59 }
60
61 assert!(run_success);
62}