formality_macros/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use spec::FormalitySpec;
4// use syn::DeriveInput;
5
6extern crate proc_macro;
7
8mod cast;
9mod debug;
10mod fixed_point;
11mod fold;
12mod parse;
13mod spec;
14mod term;
15mod test;
16mod visit;
17
18// synstructure::decl_derive!([Fold] => fold::derive_fold);
19// synstructure::decl_derive!([Parse, attributes(grammar)] => parse::derive_parse);
20
21#[proc_macro_attribute]
22pub fn term(args: TokenStream, input: TokenStream) -> TokenStream {
23    let spec = if args.is_empty() {
24        None
25    } else {
26        Some(syn::parse_macro_input!(args as FormalitySpec))
27    };
28    let input = syn::parse_macro_input!(input as syn::DeriveInput);
29
30    match term::term(spec, input) {
31        Ok(s) => s.into(),
32        Err(e) => e.into_compile_error().into(),
33    }
34}
35
36synstructure::decl_derive!([Visit] => visit::derive_visit);
37
38#[proc_macro_attribute]
39pub fn fixed_point(args: TokenStream, input: TokenStream) -> TokenStream {
40    let args = syn::parse_macro_input!(args as fixed_point::FixedPointArgs);
41    let input = syn::parse_macro_input!(input as syn::ItemFn);
42    match fixed_point::fixed_point(args, input) {
43        Ok(s) => quote!(#s).into(),
44        Err(e) => e.into_compile_error().into(),
45    }
46}
47
48#[proc_macro_attribute]
49pub fn test(args: TokenStream, input: TokenStream) -> TokenStream {
50    let input = syn::parse_macro_input!(input as syn::ItemFn);
51    match test::test(args, input) {
52        Ok(s) => quote!(#[::core::prelude::v1::test] #s).into(),
53        Err(e) => e.into_compile_error().into(),
54    }
55}