blob: 656fe908c3c735bfc5452f2208431356821bfb9c [file] [log] [blame]
Alex Crichton62a0a592017-05-22 13:58:53 -07001macro_rules! ast_struct {
2 (
3 $(#[$attr:meta])*
4 pub struct $name:ident {
5 $(
6 $(#[$field_attr:meta])*
7 pub $field:ident: $ty:ty,
8 )*
9 }
10 ) => {
11 $(#[$attr])*
12 #[derive(Debug, Clone, Eq, PartialEq, Hash)]
13 pub struct $name {
14 $(
15 $(#[$field_attr])*
16 pub $field: $ty,
17 )*
18 }
19 }
20}
21
22macro_rules! ast_enum {
23 (
24 $(#[$enum_attr:meta])*
25 pub enum $name:ident { $($variants:tt)* }
26 ) => (
27 $(#[$enum_attr])*
28 #[derive(Debug, Clone, Eq, PartialEq, Hash)]
29 pub enum $name {
30 $($variants)*
31 }
32 )
33}
34
35macro_rules! ast_enum_of_structs {
36 (
37 $(#[$enum_attr:meta])*
38 pub enum $name:ident {
39 $(
40 $(#[$variant_attr:meta])*
41 pub $variant:ident($member:ident $($rest:tt)*),
42 )*
43 }
44
45 $($remaining:tt)*
46 ) => (
47 ast_enum! {
48 $(#[$enum_attr])*
49 pub enum $name {
50 $(
51 $(#[$variant_attr])*
52 $variant($member),
53 )*
54 }
55 }
56
57 $(
58 maybe_ast_struct! {
59 $(#[$variant_attr])*
60 pub struct $member $($rest)*
61 }
62
63 impl From<$member> for $name {
64 fn from(e: $member) -> $name {
65 $name::$variant(e)
66 }
67 }
68 )*
69
70 generate_to_tokens! {
71 $($remaining)*
72 enum $name { $($variant,)* }
73 }
74 )
75}
76
77macro_rules! generate_to_tokens {
78 (do_not_generate_to_tokens $($foo:tt)*) => ();
79
80 (enum $name:ident { $($variant:ident,)* }) => (
81 #[cfg(feature = "printing")]
82 impl ::quote::ToTokens for $name {
83 fn to_tokens(&self, tokens: &mut ::quote::Tokens) {
84 match *self {
85 $(
86 $name::$variant(ref e) => e.to_tokens(tokens),
87 )*
88 }
89 }
90 }
91 )
92}
93
94macro_rules! maybe_ast_struct {
95 (
96 $(#[$attr:meta])*
97 pub struct $name:ident
98 ) => ();
99
100 ($($rest:tt)*) => (ast_struct! { $($rest)* });
101}