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