1use proc_macro::TokenStream;
2use quote::quote;
3use spec::FormalitySpec;
4extern 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#[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}