1use proc_macro::TokenStream as TokenStream1;
2use proc_macro_error::proc_macro_error;
3use syn::*;
4
5mod attribute;
6mod recurse;
7mod symbol;
8
9fn random() -> u64 {
10 use std::hash::{BuildHasher, Hasher};
11 std::collections::hash_map::RandomState::new()
12 .build_hasher()
13 .finish()
14}
15
16#[proc_macro_error]
17#[proc_macro_attribute]
18pub fn recurse(_attr: TokenStream1, input: TokenStream1) -> TokenStream1 {
19 recurse::recurse(parse_macro_input!(input)).into()
20}
21
22#[proc_macro_error]
23#[proc_macro_derive(
24 Parse,
25 attributes(
26 group,
27 syan,
28 joint,
29 alone,
30 ignore_bounds,
31 fundamental_tys,
32 predicate,
33 predicate_parse,
34 predicate_unparse
35 )
36)]
37pub fn parse_derive(input: TokenStream1) -> TokenStream1 {
38 attribute::parse(&parse_macro_input!(input), random()).into()
39}
40
41#[proc_macro_error]
42#[proc_macro_derive(
43 Unparse,
44 attributes(
45 group,
46 syan,
47 joint,
48 alone,
49 ignore_bounds,
50 fundamental_tys,
51 predicate,
52 predicate_parse,
53 predicate_unparse
54 )
55)]
56pub fn unparse(input: TokenStream1) -> TokenStream1 {
57 attribute::unparse(&parse_macro_input!(input), random()).into()
58}
59
60#[proc_macro_error]
61#[proc_macro_derive(Spanned)]
62pub fn spanned(input: TokenStream1) -> TokenStream1 {
63 attribute::spanned(&parse_macro_input!(input)).into()
64}
65
66#[proc_macro_error]
67#[proc_macro]
68pub fn symbol(input: TokenStream1) -> TokenStream1 {
69 let args = parse_macro_input!(input as symbol::SymbolArgs);
70 symbol::symbol(args).into()
71}