syan_macro/
lib.rs

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}