1 //! Defines input for code generation process.
2 
3 pub(crate) struct KindsSrc<'a> {
4     pub(crate) punct: &'a [(&'a str, &'a str)],
5     pub(crate) keywords: &'a [&'a str],
6     pub(crate) contextual_keywords: &'a [&'a str],
7     pub(crate) literals: &'a [&'a str],
8     pub(crate) tokens: &'a [&'a str],
9     pub(crate) nodes: &'a [&'a str],
10 }
11 
12 pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
13     punct: &[
14         (";", "SEMICOLON"),
15         (",", "COMMA"),
16         ("(", "L_PAREN"),
17         (")", "R_PAREN"),
18         ("{", "L_CURLY"),
19         ("}", "R_CURLY"),
20         ("[", "L_BRACK"),
21         ("]", "R_BRACK"),
22         ("<", "L_ANGLE"),
23         (">", "R_ANGLE"),
24         ("@", "AT"),
25         ("#", "POUND"),
26         ("~", "TILDE"),
27         ("?", "QUESTION"),
28         ("$", "DOLLAR"),
29         ("&", "AMP"),
30         ("|", "PIPE"),
31         ("+", "PLUS"),
32         ("*", "STAR"),
33         ("/", "SLASH"),
34         ("^", "CARET"),
35         ("%", "PERCENT"),
36         ("_", "UNDERSCORE"),
37         (".", "DOT"),
38         ("..", "DOT2"),
39         ("...", "DOT3"),
40         ("..=", "DOT2EQ"),
41         (":", "COLON"),
42         ("::", "COLON2"),
43         ("=", "EQ"),
44         ("==", "EQ2"),
45         ("=>", "FAT_ARROW"),
46         ("!", "BANG"),
47         ("!=", "NEQ"),
48         ("-", "MINUS"),
49         ("->", "THIN_ARROW"),
50         ("<=", "LTEQ"),
51         (">=", "GTEQ"),
52         ("+=", "PLUSEQ"),
53         ("-=", "MINUSEQ"),
54         ("|=", "PIPEEQ"),
55         ("&=", "AMPEQ"),
56         ("^=", "CARETEQ"),
57         ("/=", "SLASHEQ"),
58         ("*=", "STAREQ"),
59         ("%=", "PERCENTEQ"),
60         ("&&", "AMP2"),
61         ("||", "PIPE2"),
62         ("<<", "SHL"),
63         (">>", "SHR"),
64         ("<<=", "SHLEQ"),
65         (">>=", "SHREQ"),
66     ],
67     keywords: &[
68         "as", "async", "await", "box", "break", "const", "continue", "crate", "dyn", "else",
69         "enum", "extern", "false", "fn", "for", "if", "impl", "in", "let", "loop", "macro",
70         "match", "mod", "move", "mut", "pub", "ref", "return", "self", "static", "struct", "super",
71         "trait", "true", "try", "type", "unsafe", "use", "where", "while", "yield",
72     ],
73     contextual_keywords: &["auto", "default", "existential", "union", "raw", "macro_rules"],
74     literals: &["INT_NUMBER", "FLOAT_NUMBER", "CHAR", "BYTE", "STRING", "BYTE_STRING"],
75     tokens: &["ERROR", "IDENT", "WHITESPACE", "LIFETIME_IDENT", "COMMENT", "SHEBANG"],
76     nodes: &[
77         "SOURCE_FILE",
78         "STRUCT",
79         "UNION",
80         "ENUM",
81         "FN",
82         "RET_TYPE",
83         "EXTERN_CRATE",
84         "MODULE",
85         "USE",
86         "STATIC",
87         "CONST",
88         "TRAIT",
89         "IMPL",
90         "TYPE_ALIAS",
91         "MACRO_CALL",
92         "MACRO_RULES",
93         "MACRO_ARM",
94         "TOKEN_TREE",
95         "MACRO_DEF",
96         "PAREN_TYPE",
97         "TUPLE_TYPE",
98         "MACRO_TYPE",
99         "NEVER_TYPE",
100         "PATH_TYPE",
101         "PTR_TYPE",
102         "ARRAY_TYPE",
103         "SLICE_TYPE",
104         "REF_TYPE",
105         "INFER_TYPE",
106         "FN_PTR_TYPE",
107         "FOR_TYPE",
108         "IMPL_TRAIT_TYPE",
109         "DYN_TRAIT_TYPE",
110         "OR_PAT",
111         "PAREN_PAT",
112         "REF_PAT",
113         "BOX_PAT",
114         "IDENT_PAT",
115         "WILDCARD_PAT",
116         "REST_PAT",
117         "PATH_PAT",
118         "RECORD_PAT",
119         "RECORD_PAT_FIELD_LIST",
120         "RECORD_PAT_FIELD",
121         "TUPLE_STRUCT_PAT",
122         "TUPLE_PAT",
123         "SLICE_PAT",
124         "RANGE_PAT",
125         "LITERAL_PAT",
126         "MACRO_PAT",
127         "CONST_BLOCK_PAT",
128         // atoms
129         "TUPLE_EXPR",
130         "ARRAY_EXPR",
131         "PAREN_EXPR",
132         "PATH_EXPR",
133         "CLOSURE_EXPR",
134         "IF_EXPR",
135         "WHILE_EXPR",
136         "CONDITION",
137         "LOOP_EXPR",
138         "FOR_EXPR",
139         "CONTINUE_EXPR",
140         "BREAK_EXPR",
141         "LABEL",
142         "BLOCK_EXPR",
143         "STMT_LIST",
144         "RETURN_EXPR",
145         "YIELD_EXPR",
146         "MATCH_EXPR",
147         "MATCH_ARM_LIST",
148         "MATCH_ARM",
149         "MATCH_GUARD",
150         "RECORD_EXPR",
151         "RECORD_EXPR_FIELD_LIST",
152         "RECORD_EXPR_FIELD",
153         "BOX_EXPR",
154         // postfix
155         "CALL_EXPR",
156         "INDEX_EXPR",
157         "METHOD_CALL_EXPR",
158         "FIELD_EXPR",
159         "AWAIT_EXPR",
160         "TRY_EXPR",
161         "CAST_EXPR",
162         // unary
163         "REF_EXPR",
164         "PREFIX_EXPR",
165         "RANGE_EXPR", // just weird
166         "BIN_EXPR",
167         "EXTERN_BLOCK",
168         "EXTERN_ITEM_LIST",
169         "VARIANT",
170         "RECORD_FIELD_LIST",
171         "RECORD_FIELD",
172         "TUPLE_FIELD_LIST",
173         "TUPLE_FIELD",
174         "VARIANT_LIST",
175         "ITEM_LIST",
176         "ASSOC_ITEM_LIST",
177         "ATTR",
178         "META",
179         "USE_TREE",
180         "USE_TREE_LIST",
181         "PATH",
182         "PATH_SEGMENT",
183         "LITERAL",
184         "RENAME",
185         "VISIBILITY",
186         "WHERE_CLAUSE",
187         "WHERE_PRED",
188         "ABI",
189         "NAME",
190         "NAME_REF",
191         "LET_STMT",
192         "LET_ELSE",
193         "EXPR_STMT",
194         "GENERIC_PARAM_LIST",
195         "GENERIC_PARAM",
196         "LIFETIME_PARAM",
197         "TYPE_PARAM",
198         "CONST_PARAM",
199         "GENERIC_ARG_LIST",
200         "LIFETIME",
201         "LIFETIME_ARG",
202         "TYPE_ARG",
203         "ASSOC_TYPE_ARG",
204         "CONST_ARG",
205         "PARAM_LIST",
206         "PARAM",
207         "SELF_PARAM",
208         "ARG_LIST",
209         "TYPE_BOUND",
210         "TYPE_BOUND_LIST",
211         // macro related
212         "MACRO_ITEMS",
213         "MACRO_STMTS",
214     ],
215 };
216 
217 #[derive(Default, Debug)]
218 pub(crate) struct AstSrc {
219     pub(crate) tokens: Vec<String>,
220     pub(crate) nodes: Vec<AstNodeSrc>,
221     pub(crate) enums: Vec<AstEnumSrc>,
222 }
223 
224 #[derive(Debug)]
225 pub(crate) struct AstNodeSrc {
226     pub(crate) doc: Vec<String>,
227     pub(crate) name: String,
228     pub(crate) traits: Vec<String>,
229     pub(crate) fields: Vec<Field>,
230 }
231 
232 #[derive(Debug, Eq, PartialEq)]
233 pub(crate) enum Field {
234     Token(String),
235     Node { name: String, ty: String, cardinality: Cardinality },
236 }
237 
238 #[derive(Debug, Eq, PartialEq)]
239 pub(crate) enum Cardinality {
240     Optional,
241     Many,
242 }
243 
244 #[derive(Debug)]
245 pub(crate) struct AstEnumSrc {
246     pub(crate) doc: Vec<String>,
247     pub(crate) name: String,
248     pub(crate) traits: Vec<String>,
249     pub(crate) variants: Vec<String>,
250 }
251