1use crate::spec::{EnumBuilder, Node, NodesAggregator, StructBuilder};
2
3pub fn get_spec() -> Vec<Node> {
5    NodesAggregator::default()
6    .add_list("Trivia", "Trivium")
7    .add_enum(
8        EnumBuilder::new("Trivium")
9            .node_with_explicit_kind("SingleLineComment", "TokenSingleLineComment")
10            .node_with_explicit_kind("SingleLineDocComment", "TokenSingleLineDocComment")
11            .node_with_explicit_kind("SingleLineInnerComment", "TokenSingleLineInnerComment")
12            .node_with_explicit_kind("Whitespace", "TokenWhitespace")
13            .node_with_explicit_kind("Newline", "TokenNewline")
14            .node_with_explicit_kind("Skipped", "TokenSkipped")
15            .node("SkippedNode"),
16    )
17    .add_enum(EnumBuilder::new("Expr")
19        .missing("Missing")
20        .node("Path")
21        .node_with_explicit_kind("Literal", "TerminalLiteralNumber")
22        .node_with_explicit_kind("ShortString", "TerminalShortString")
23        .node_with_explicit_kind("String", "TerminalString")
24        .node_with_explicit_kind("False", "TerminalFalse")
25        .node_with_explicit_kind("True", "TerminalTrue")
26        .node("Parenthesized")
27        .node("Unary")
28        .node("Binary")
29        .node_with_explicit_kind("Tuple", "ExprListParenthesized")
30        .node("FunctionCall")
31        .node("StructCtorCall")
32        .node("Block")
33        .node("Match")
34        .node("If")
35        .node("Loop")
36        .node("While")
37        .node("For")
38        .node("Closure")
39        .node("ErrorPropagate")
40        .node("FieldInitShorthand")
41        .node("Indexed")
42        .node("InlineMacro")
43        .node("FixedSizeArray")
44    )
45    .add_separated_list("ExprList", "Expr", "TerminalComma")
46    .add_struct(StructBuilder::new("Arg")
47        .node("modifiers", "ModifierList")
48        .node("arg_clause", "ArgClause")
49    )
50    .add_enum(EnumBuilder::new("ArgClause")
51        .node("Unnamed")
52        .node("Named")
53        .node("FieldInitShorthand")
54    )
55    .add_struct(StructBuilder::new("ArgClauseNamed")
56        .node("name", "TerminalIdentifier")
57        .node("colon", "TerminalColon")
58        .node("value", "Expr")
59    )
60    .add_struct(StructBuilder::new("ArgClauseUnnamed")
61        .node("value", "Expr")
62    )
63    .add_struct(StructBuilder::new("ArgClauseFieldInitShorthand")
64        .node("colon", "TerminalColon")
65        .node("name", "ExprFieldInitShorthand")
66    )
67    .add_struct(StructBuilder::new("ExprFieldInitShorthand")
68        .node("name", "TerminalIdentifier")
69    )
70    .add_separated_list("ArgList", "Arg", "TerminalComma")
71    .add_struct(StructBuilder::new("ExprMissing"))
72    .add_enum(EnumBuilder::new("PathSegment")
73        .node("Simple")
74        .node("WithGenericArgs")
75        .missing("Missing")
76    )
77    .add_struct(StructBuilder::new("PathSegmentSimple").node("ident", "TerminalIdentifier"))
78    .add_option("TerminalColonColon")
79    .add_struct(StructBuilder::new("PathSegmentWithGenericArgs")
80        .node("ident", "TerminalIdentifier")
81        .node("separator", "OptionTerminalColonColon")
82        .node("generic_args", "GenericArgs")
83    )
84    .add_struct(StructBuilder::new("ExprPath")
85        .node("dollar", "OptionTerminalDollar")
86        .node("segments", "ExprPathInner")
87    )
88    .add_option("TerminalDollar")
89    .add_struct(StructBuilder::new("PathSegmentMissing").node("ident","TerminalIdentifier"))
92    .add_separated_list("ExprPathInner", "PathSegment", "TerminalColonColon")
93    .add_struct(StructBuilder::new("ExprParenthesized")
94        .node("lparen", "TerminalLParen")
95        .node("expr", "Expr")
96        .node("rparen", "TerminalRParen")
97    )
98    .add_struct(StructBuilder::new("ExprUnary").node("op", "UnaryOperator").node("expr", "Expr"))
99    .add_enum(EnumBuilder::new("UnaryOperator")
100        .node_with_explicit_kind("Not", "TerminalNot")
101        .node_with_explicit_kind("BitNot", "TerminalBitNot")
102        .node_with_explicit_kind("Minus", "TerminalMinus")
103        .node_with_explicit_kind("At", "TerminalAt")
104        .node_with_explicit_kind("Desnap", "TerminalMul")
105    )
106    .add_struct(StructBuilder::new("ExprBinary")
107        .node("lhs", "Expr")
108        .node("op", "BinaryOperator")
109        .node("rhs", "Expr")
110    )
111    .add_enum(EnumBuilder::new("BinaryOperator")
112        .node_with_explicit_kind("Dot", "TerminalDot")
113        .node_with_explicit_kind("Not", "TerminalNot")
114        .node_with_explicit_kind("Mul", "TerminalMul")
115        .node_with_explicit_kind("MulEq", "TerminalMulEq")
116        .node_with_explicit_kind("Div", "TerminalDiv")
117        .node_with_explicit_kind("DivEq", "TerminalDivEq")
118        .node_with_explicit_kind("Mod", "TerminalMod")
119        .node_with_explicit_kind("ModEq", "TerminalModEq")
120        .node_with_explicit_kind("Plus", "TerminalPlus")
121        .node_with_explicit_kind("PlusEq", "TerminalPlusEq")
122        .node_with_explicit_kind("Minus", "TerminalMinus")
123        .node_with_explicit_kind("MinusEq", "TerminalMinusEq")
124        .node_with_explicit_kind("EqEq", "TerminalEqEq")
125        .node_with_explicit_kind("Neq", "TerminalNeq")
126        .node_with_explicit_kind("Eq", "TerminalEq")
127        .node_with_explicit_kind("And", "TerminalAnd")
128        .node_with_explicit_kind("AndAnd", "TerminalAndAnd")
129        .node_with_explicit_kind("Or", "TerminalOr")
130        .node_with_explicit_kind("OrOr", "TerminalOrOr")
131        .node_with_explicit_kind("Xor", "TerminalXor")
132        .node_with_explicit_kind("LE", "TerminalLE")
133        .node_with_explicit_kind("GE", "TerminalGE")
134        .node_with_explicit_kind("LT", "TerminalLT")
135        .node_with_explicit_kind("GT", "TerminalGT")
136        .node_with_explicit_kind("DotDot", "TerminalDotDot")
137        .node_with_explicit_kind("DotDotEq", "TerminalDotDotEq")
138    )
139    .add_struct(StructBuilder::new("ExprListParenthesized")
140        .node("lparen", "TerminalLParen")
141        .node("expressions", "ExprList")
142        .node("rparen", "TerminalRParen")
143    )
144    .add_struct(StructBuilder::new("ExprFunctionCall")
145        .node("path", "ExprPath")
146        .node("arguments", "ArgListParenthesized")
147    )
148    .add_struct(StructBuilder::new("ArgListParenthesized")
149        .node("lparen", "TerminalLParen")
150        .node("arguments", "ArgList")
151        .node("rparen", "TerminalRParen")
152    )
153    .add_option("ArgListParenthesized")
154    .add_struct(StructBuilder::new("ExprStructCtorCall")
155        .node("path", "ExprPath")
156        .node("arguments", "StructArgListBraced")
157    )
158    .add_struct(StructBuilder::new("StructArgListBraced")
159        .node("lbrace", "TerminalLBrace")
160        .node("arguments", "StructArgList")
161        .node("rbrace", "TerminalRBrace")
162    )
163    .add_struct(StructBuilder::new("ExprBlock")
164        .node("lbrace", "TerminalLBrace")
165        .node("statements", "StatementList")
166        .node("rbrace", "TerminalRBrace")
167    )
168    .add_struct(StructBuilder::new("ExprMatch")
169        .node("match_kw", "TerminalMatch")
170        .node("expr", "Expr")
172        .node("lbrace", "TerminalLBrace")
173        .node("arms", "MatchArms")
174        .node("rbrace", "TerminalRBrace")
175    )
176    .add_separated_list("MatchArms", "MatchArm", "TerminalComma")
177    .add_struct(StructBuilder::new("MatchArm")
178        .node("patterns", "PatternListOr")
179        .node("arrow", "TerminalMatchArrow")
180        .node("expression", "Expr")
181    )
182    .add_struct(StructBuilder::new("ExprIf")
183        .node("if_kw", "TerminalIf")
184        .node("conditions", "ConditionListAnd")
185        .node("if_block", "ExprBlock")
186        .node("else_clause", "OptionElseClause")
187    )
188    .add_separated_list("ConditionListAnd", "Condition", "TerminalAndAnd")
189    .add_enum(EnumBuilder::new("Condition")
190        .node("Let")
191        .node("Expr")
192    )
193    .add_struct(StructBuilder::new("ConditionLet")
194        .node("let_kw", "TerminalLet")
195        .node("patterns", "PatternListOr")
196        .node("eq", "TerminalEq")
197        .node("expr", "Expr")
198    )
199    .add_struct(StructBuilder::new("ConditionExpr")
200        .node("expr", "Expr")
201    )
202    .add_enum(EnumBuilder::new("BlockOrIf")
203        .node_with_explicit_kind("Block", "ExprBlock")
204        .node_with_explicit_kind("If", "ExprIf")
205    )
206    .add_struct(StructBuilder::new("ExprLoop")
207        .node("loop_kw", "TerminalLoop")
208        .node("body", "ExprBlock")
209    )
210    .add_struct(StructBuilder::new("ExprWhile")
211        .node("while_kw", "TerminalWhile")
212        .node("conditions", "ConditionListAnd")
213        .node("body", "ExprBlock")
214    )
215    .add_struct(StructBuilder::new("ExprFor")
216        .node("for_kw", "TerminalFor")
217        .key_node("pattern", "Pattern")
218        .key_node("identifier", "TerminalIdentifier")
219        .node("expr", "Expr")
220        .node("body", "ExprBlock")
221    )
222    .add_struct(StructBuilder::new("ElseClause")
223        .node("else_kw", "TerminalElse")
224        .node("else_block_or_if", "BlockOrIf")
225    )
226    .add_option("ElseClause")
227    .add_struct(StructBuilder::new("ExprErrorPropagate").node("expr", "Expr").node("op", "TerminalQuestionMark"))
228    .add_struct(StructBuilder::new("ExprIndexed")
229        .node("expr", "Expr")
230        .node("lbrack", "TerminalLBrack")
231        .node("index_expr", "Expr")
232        .node("rbrack", "TerminalRBrack")
233    )
234    .add_struct(StructBuilder::new("ExprFixedSizeArray")
235        .node("lbrack", "TerminalLBrack")
236        .node("exprs", "ExprList")
237        .node("size", "OptionFixedSizeArraySize")
238        .node("rbrack", "TerminalRBrack")
239    )
240    .add_struct(StructBuilder::new("FixedSizeArraySize")
241        .node("semicolon", "TerminalSemicolon")
242        .node("size", "Expr")
243    )
244    .add_option("FixedSizeArraySize")
245    .add_struct(StructBuilder::new("ExprClosure")
246        .node("wrapper", "ClosureParamWrapper")
247        .node("ret_ty", "OptionReturnTypeClause")
248        .node("optional_no_panic", "OptionTerminalNoPanic")
249        .node("expr", "Expr")
250    )
251    .add_enum(EnumBuilder::new("ClosureParamWrapper")
252        .node_with_explicit_kind("Nullary", "TerminalOrOr")
253        .node("NAry")
254    )
255    .add_struct(StructBuilder::new("ClosureParamWrapperNAry")
256        .node("leftor","TerminalOr")
257        .node("params", "ParamList")
258        .node("rightor", "TerminalOr")
259    )
260    .add_struct(StructBuilder::new("StructArgExpr")
262        .node("colon", "TerminalColon")
263        .node("expr", "Expr")
264    )
265    .add_option("StructArgExpr")
266    .add_struct(StructBuilder::new("StructArgSingle")
267        .key_node("identifier", "TerminalIdentifier")
268        .node("arg_expr", "OptionStructArgExpr")
269    )
270    .add_struct(StructBuilder::new("StructArgTail")
271        .node("dotdot", "TerminalDotDot")
272        .node("expression", "Expr")
273    )
274    .add_enum(EnumBuilder::new("StructArg")
275        .node_with_explicit_kind("StructArgSingle", "StructArgSingle")
276        .node_with_explicit_kind("StructArgTail", "StructArgTail")
277    )
278    .add_separated_list("StructArgList", "StructArg", "TerminalComma")
279    .add_struct(StructBuilder::new("ArgListBraced")
280        .node("lbrace", "TerminalLBrace")
281        .node("arguments", "ArgList")
282        .node("rbrace", "TerminalRBrace")
283    )
284    .add_struct(StructBuilder::new("ArgListBracketed")
285        .node("lbrack", "TerminalLBrack")
286        .node("arguments", "ArgList")
287        .node("rbrack", "TerminalRBrack")
288    )
289    .add_enum(EnumBuilder::new("WrappedArgList")
290        .missing("Missing")
291        .node_with_explicit_kind("BracketedArgList", "ArgListBracketed")
292        .node_with_explicit_kind("ParenthesizedArgList", "ArgListParenthesized")
293        .node_with_explicit_kind("BracedArgList", "ArgListBraced")
294    )
295    .add_struct(StructBuilder::new("WrappedArgListMissing"))
296    .add_enum(EnumBuilder::new("Pattern")
300        .node_with_explicit_kind("Underscore", "TerminalUnderscore")
301        .node_with_explicit_kind("Literal", "TerminalLiteralNumber")
302        .node_with_explicit_kind("False", "TerminalFalse")
303        .node_with_explicit_kind("True", "TerminalTrue")
304        .node_with_explicit_kind("ShortString", "TerminalShortString")
305        .node_with_explicit_kind("String", "TerminalString")
306        .node("Identifier")
307        .node("Struct")
308        .node("Tuple")
309        .node("Enum")
310        .node("FixedSizeArray")
311        .node_with_explicit_kind("Path", "ExprPath")
312    )
313    .add_struct(StructBuilder::new("PatternIdentifier")
314        .node("modifiers", "ModifierList")
315        .key_node("name", "TerminalIdentifier")
316    )
317    .add_struct(StructBuilder::new("PatternStruct")
318        .node("path", "ExprPath")
320        .node("lbrace", "TerminalLBrace")
321        .node("params", "PatternStructParamList")
322        .node("rbrace", "TerminalRBrace")
323    )
324    .add_separated_list("PatternStructParamList", "PatternStructParam", "TerminalComma")
325    .add_struct(StructBuilder::new("PatternTuple")
326        .node("lparen", "TerminalLParen")
327        .node("patterns", "PatternList")
328        .node("rparen", "TerminalRParen")
329    )
330    .add_struct(StructBuilder::new("PatternFixedSizeArray")
331        .node("lbrack", "TerminalLBrack")
332        .node("patterns", "PatternList")
333        .node("rbrack", "TerminalRBrack"))
334    .add_separated_list("PatternList", "Pattern", "TerminalComma")
335    .add_separated_list("PatternListOr", "Pattern", "TerminalOr")
336    .add_enum(EnumBuilder::new("PatternStructParam")
337        .node_with_explicit_kind("Single", "PatternIdentifier")
338        .node("WithExpr")
339        .node_with_explicit_kind("Tail", "TerminalDotDot")
340    )
341    .add_struct(StructBuilder::new("PatternStructParamWithExpr")
342        .node("modifiers", "ModifierList")
343        .node("name", "TerminalIdentifier")
344        .node("colon", "TerminalColon")
345        .node("pattern", "Pattern")
346    )
347    .add_struct(StructBuilder::new("PatternEnum")
348        .node("path", "ExprPath")
349        .node("pattern", "OptionPatternEnumInnerPattern")
350    )
351    .add_struct(StructBuilder::new("PatternEnumInnerPattern")
352        .node("lparen", "TerminalLParen")
353        .node("pattern", "Pattern")
354        .node("rparen", "TerminalRParen")
355    )
356    .add_option("PatternEnumInnerPattern")
357    .add_struct(StructBuilder::new("TypeClause").node("colon", "TerminalColon").node("ty", "Expr"))
360    .add_option("TypeClause")
361    .add_struct(StructBuilder::new("ReturnTypeClause")
362        .node("arrow", "TerminalArrow")
363        .node("ty", "Expr")
364    )
365    .add_option("ReturnTypeClause")
366    .add_enum(EnumBuilder::new("Statement")
368        .missing("Missing")
369        .node("Let")
370        .node("Expr")
371        .node("Continue")
372        .node("Return")
373        .node("Break")
374        .node("Item")
375    )
376    .add_list("StatementList", "Statement")
377    .add_struct(StructBuilder::new("StatementMissing"))
378    .add_struct(StructBuilder::new("StatementLet")
379        .node("attributes" ,"AttributeList")
380        .node("let_kw", "TerminalLet")
381        .key_node("pattern", "Pattern")
382        .node("type_clause", "OptionTypeClause")
383        .node("eq", "TerminalEq")
384        .node("rhs", "Expr")
385        .node("let_else_clause", "OptionLetElseClause")
386        .node("semicolon", "TerminalSemicolon")
387    )
388    .add_struct(StructBuilder::new("LetElseClause")
389        .node("else_kw", "TerminalElse")
390        .node("else_block", "ExprBlock")
391    )
392    .add_option("LetElseClause")
393    .add_option("TerminalSemicolon")
394    .add_struct(StructBuilder::new("StatementExpr")
395        .node("attributes" ,"AttributeList")
396        .node("expr", "Expr")
397        .node("semicolon", "OptionTerminalSemicolon")
398    )
399    .add_struct(StructBuilder::new("StatementContinue")
400        .node("attributes" ,"AttributeList")
401        .node("continue_kw", "TerminalContinue")
402        .node("semicolon", "TerminalSemicolon")
403    )
404    .add_struct(StructBuilder::new("ExprClause")
405        .node("expr", "Expr"))
406    .add_option("ExprClause")
407    .add_struct(StructBuilder::new("StatementReturn")
408        .node("attributes" ,"AttributeList")
409        .node("return_kw", "TerminalReturn")
410        .node("expr_clause", "OptionExprClause")
411        .node("semicolon", "TerminalSemicolon")
412    )
413    .add_struct(StructBuilder::new("StatementBreak")
414        .node("attributes" ,"AttributeList")
415        .node("break_kw", "TerminalBreak")
416        .node("expr_clause", "OptionExprClause")
417        .node("semicolon", "TerminalSemicolon")
418    )
419    .add_struct(StructBuilder::new("StatementItem")
420        .node("item", "ModuleItem")
421    )
422    .add_struct(StructBuilder::new("Param")
424        .node("modifiers", "ModifierList")
425        .key_node("name", "TerminalIdentifier")
426        .node("type_clause", "OptionTypeClause")
427    )
428    .add_list("ModifierList", "Modifier")
429    .add_enum(EnumBuilder::new("Modifier")
430        .node_with_explicit_kind("Ref", "TerminalRef")
431        .node_with_explicit_kind("Mut", "TerminalMut")
432    )
433    .add_separated_list("ParamList", "Param", "TerminalComma")
434    .add_struct(StructBuilder::new("ImplicitsClause")
435        .node("implicits_kw", "TerminalImplicits")
436        .node("lparen", "TerminalLParen")
437        .node("implicits", "ImplicitsList")
438        .node("rparen", "TerminalRParen")
439    )
440    .add_separated_list("ImplicitsList", "ExprPath", "TerminalComma")
441    .add_option("ImplicitsClause")
442    .add_option("TerminalNoPanic")
443    .add_option("TerminalConst")
444    .add_struct(StructBuilder::new("FunctionSignature")
447        .node("lparen", "TerminalLParen")
448        .node("parameters", "ParamList")
449        .node("rparen", "TerminalRParen")
450        .node("ret_ty", "OptionReturnTypeClause")
451        .node("implicits_clause", "OptionImplicitsClause")
452        .node("optional_no_panic", "OptionTerminalNoPanic")
453    )
454    .add_struct(StructBuilder::new("Member")
457        .node("attributes" ,"AttributeList")
458        .node("visibility", "Visibility")
459        .key_node("name", "TerminalIdentifier")
460        .node("type_clause", "TypeClause")
461    )
462    .add_separated_list("MemberList", "Member", "TerminalComma")
463    .add_struct(StructBuilder::new("Variant")
464        .node("attributes" ,"AttributeList")
465        .key_node("name", "TerminalIdentifier")
466        .node("type_clause", "OptionTypeClause")
467    )
468    .add_separated_list("VariantList", "Variant", "TerminalComma")
469    .add_enum(EnumBuilder::new("ModuleItem")
471        .missing("Missing")
472        .node_with_explicit_kind("Constant", "ItemConstant")
473        .node_with_explicit_kind("Module", "ItemModule")
474        .node_with_explicit_kind("Use", "ItemUse")
475        .node_with_explicit_kind("FreeFunction", "FunctionWithBody")
476        .node_with_explicit_kind("ExternFunction", "ItemExternFunction")
477        .node_with_explicit_kind("ExternType", "ItemExternType")
478        .node_with_explicit_kind("Trait", "ItemTrait")
479        .node_with_explicit_kind("Impl", "ItemImpl")
480        .node_with_explicit_kind("ImplAlias", "ItemImplAlias")
481        .node_with_explicit_kind("Struct", "ItemStruct")
482        .node_with_explicit_kind("Enum", "ItemEnum")
483        .node_with_explicit_kind("TypeAlias", "ItemTypeAlias")
484        .node_with_explicit_kind("InlineMacro", "ItemInlineMacro")
485        .node_with_explicit_kind("MacroDeclaration", "ItemMacroDeclaration")
486        .node_with_explicit_kind("HeaderDoc", "ItemHeaderDoc")
487    )
488    .add_list("ModuleItemList", "ModuleItem")
489    .add_struct(StructBuilder::new("ModuleItemMissing"))
490    .add_struct(StructBuilder::new("Attribute")
491        .node("hash", "TerminalHash")
492        .node("lbrack", "TerminalLBrack")
493        .node("attr", "ExprPath")
494        .node("arguments", "OptionArgListParenthesized")
495        .node("rbrack", "TerminalRBrack")
496    )
497    .add_list("AttributeList", "Attribute")
498    .add_struct(StructBuilder::new("VisibilityDefault"))
499    .add_struct(StructBuilder::new("VisibilityPubArgumentClause")
500        .node("lparen", "TerminalLParen")
501        .node("argument", "TerminalIdentifier")
502        .node("rparen", "TerminalRParen")
503    )
504    .add_option("VisibilityPubArgumentClause")
505    .add_struct(StructBuilder::new("VisibilityPub")
506        .node("pub_kw", "TerminalPub")
507        .node("argument_clause", "OptionVisibilityPubArgumentClause")
508    )
509    .add_enum(EnumBuilder::new("Visibility")
510        .node("Default")
511        .node("Pub")
512    )
513    .add_struct(StructBuilder::new("ItemModule")
514        .node("attributes" ,"AttributeList")
515        .node("visibility", "Visibility")
516        .node("module_kw", "TerminalModule")
517        .key_node("name", "TerminalIdentifier")
518        .node("body", "MaybeModuleBody")
519    )
520    .add_enum(EnumBuilder::new("MaybeModuleBody")
521        .node_with_explicit_kind("Some", "ModuleBody")
522        .node_with_explicit_kind("None", "TerminalSemicolon")
523    )
524    .add_struct(StructBuilder::new("ModuleBody")
525        .node("lbrace", "TerminalLBrace")
526        .node("items", "ModuleItemList")
527        .node("rbrace", "TerminalRBrace")
528    )
529    .add_struct(StructBuilder::new("FunctionDeclaration")
530        .node("optional_const", "OptionTerminalConst")
531        .node("function_kw", "TerminalFunction")
532        .key_node("name", "TerminalIdentifier")
533        .node("generic_params", "OptionWrappedGenericParamList")
534        .node("signature", "FunctionSignature")
535    )
536    .add_struct(StructBuilder::new("ItemConstant")
537        .node("attributes" ,"AttributeList")
538        .node("visibility", "Visibility")
539        .node("const_kw", "TerminalConst")
540        .key_node("name", "TerminalIdentifier")
541        .node("type_clause", "TypeClause")
542        .node("eq", "TerminalEq")
543        .node("value", "Expr")
544        .node("semicolon", "TerminalSemicolon")
545    )
546    .add_struct(StructBuilder::new("FunctionWithBody")
547        .node("attributes" ,"AttributeList")
548        .node("visibility", "Visibility")
549         .key_node("declaration", "FunctionDeclaration")
551        .node("body", "ExprBlock")
552    )
553    .add_struct(StructBuilder::new("ItemExternFunction")
554        .node("attributes" ,"AttributeList")
555        .node("visibility", "Visibility")
556        .node("extern_kw", "TerminalExtern")
557         .key_node("declaration", "FunctionDeclaration")
559        .node("semicolon", "TerminalSemicolon")
560    )
561    .add_struct(StructBuilder::new("ItemExternType")
562        .node("attributes" ,"AttributeList")
563        .node("visibility", "Visibility")
564        .node("extern_kw", "TerminalExtern")
565        .node("type_kw", "TerminalType")
566        .key_node("name", "TerminalIdentifier")
567        .node("generic_params", "OptionWrappedGenericParamList")
568        .node("semicolon", "TerminalSemicolon")
569    )
570    .add_struct(StructBuilder::new("ItemTrait")
571        .node("attributes" ,"AttributeList")
572        .node("visibility", "Visibility")
573        .node("trait_kw", "TerminalTrait")
574        .key_node("name", "TerminalIdentifier")
575        .node("generic_params", "OptionWrappedGenericParamList")
576        .node("body", "MaybeTraitBody")
577    )
578    .add_enum(EnumBuilder::new("MaybeTraitBody")
579        .node_with_explicit_kind("Some", "TraitBody")
580        .node_with_explicit_kind("None", "TerminalSemicolon")
581    )
582    .add_struct(StructBuilder::new("TraitBody")
583        .node("lbrace", "TerminalLBrace")
584        .node("items", "TraitItemList")
585        .node("rbrace", "TerminalRBrace")
586    )
587    .add_list("TraitItemList", "TraitItem")
588    .add_enum(EnumBuilder::new("TraitItem")
589        .missing("Missing")
590        .node("Function")
591        .node("Type")
592        .node("Constant")
593        .node("Impl")
594    )
595    .add_struct(StructBuilder::new("TraitItemMissing"))
596    .add_struct(StructBuilder::new("TraitItemFunction")
597        .node("attributes" ,"AttributeList")
598         .key_node("declaration", "FunctionDeclaration")
600        .node("body", "MaybeTraitFunctionBody")
601    )
602    .add_struct(StructBuilder::new("TraitItemType")
603        .node("attributes" ,"AttributeList")
604        .node("type_kw", "TerminalType")
605        .key_node("name", "TerminalIdentifier")
606        .node("generic_params", "OptionWrappedGenericParamList")
607        .node("semicolon", "TerminalSemicolon")
608    )
609    .add_struct(StructBuilder::new("TraitItemConstant")
610        .node("attributes" ,"AttributeList")
611        .node("const_kw", "TerminalConst")
612        .key_node("name", "TerminalIdentifier")
613        .node("type_clause", "TypeClause")
614        .node("semicolon", "TerminalSemicolon")
615    )
616    .add_struct(StructBuilder::new("TraitItemImpl")
617        .node("attributes" ,"AttributeList")
618        .node("impl_kw", "TerminalImpl")
619        .key_node("name", "TerminalIdentifier")
620        .node("colon", "TerminalColon")
621        .node("trait_path", "ExprPath")
622        .node("semicolon", "TerminalSemicolon")
623    )
624    .add_enum(EnumBuilder::new("MaybeTraitFunctionBody")
625        .node_with_explicit_kind("Some", "ExprBlock")
626        .node_with_explicit_kind("None", "TerminalSemicolon")
627    )
628    .add_struct(StructBuilder::new("ItemImpl")
629        .node("attributes" ,"AttributeList")
630        .node("visibility", "Visibility")
631        .node("impl_kw", "TerminalImpl")
632        .key_node("name", "TerminalIdentifier")
633        .node("generic_params", "OptionWrappedGenericParamList")
634        .node("of_kw", "TerminalOf")
635        .node("trait_path", "ExprPath")
636        .node("body", "MaybeImplBody")
637    )
638    .add_struct(StructBuilder::new("ItemHeaderDoc")
642        .node("empty", "TerminalEmpty"))
643    .add_enum(EnumBuilder::new("MaybeImplBody")
644        .node_with_explicit_kind("Some", "ImplBody")
645        .node_with_explicit_kind("None", "TerminalSemicolon")
646    )
647    .add_struct(StructBuilder::new("ImplBody")
648            .node("lbrace", "TerminalLBrace")
649            .node("items", "ImplItemList")
650            .node("rbrace", "TerminalRBrace")
651    )
652    .add_list("ImplItemList", "ImplItem")
653    .add_enum(EnumBuilder::new("ImplItem")
654        .missing("Missing")
655        .node_with_explicit_kind("Function", "FunctionWithBody")
656        .node_with_explicit_kind("Type", "ItemTypeAlias")
657        .node_with_explicit_kind("Constant", "ItemConstant")
658        .node_with_explicit_kind("Impl", "ItemImplAlias")
659        .node_with_explicit_kind("Module", "ItemModule")
661        .node_with_explicit_kind("Use", "ItemUse")
662        .node_with_explicit_kind("ExternFunction", "ItemExternFunction")
663        .node_with_explicit_kind("ExternType", "ItemExternType")
664        .node_with_explicit_kind("Trait", "ItemTrait")
665        .node_with_explicit_kind("Struct", "ItemStruct")
666        .node_with_explicit_kind("Enum", "ItemEnum")
667    )
668    .add_struct(StructBuilder::new("ImplItemMissing"))
669    .add_struct(StructBuilder::new("ItemImplAlias")
670        .node("attributes" ,"AttributeList")
671        .node("visibility", "Visibility")
672        .node("impl_kw", "TerminalImpl")
673        .key_node("name", "TerminalIdentifier")
674        .node("generic_params", "OptionWrappedGenericParamList")
675        .node("eq", "TerminalEq")
676        .node("impl_path", "ExprPath")
677        .node("semicolon", "TerminalSemicolon")
678    )
679    .add_struct(StructBuilder::new("ItemStruct")
680        .node("attributes" ,"AttributeList")
681        .node("visibility", "Visibility")
682        .node("struct_kw", "TerminalStruct")
683        .key_node("name", "TerminalIdentifier")
684        .node("generic_params", "OptionWrappedGenericParamList")
685        .node("lbrace", "TerminalLBrace")
686        .node("members", "MemberList")
687        .node("rbrace", "TerminalRBrace")
688    )
689    .add_struct(StructBuilder::new("ItemEnum")
690        .node("attributes" ,"AttributeList")
691        .node("visibility", "Visibility")
692        .node("enum_kw", "TerminalEnum")
693        .key_node("name", "TerminalIdentifier")
694        .node("generic_params", "OptionWrappedGenericParamList")
695        .node("lbrace", "TerminalLBrace")
696        .node("variants", "VariantList")
697        .node("rbrace", "TerminalRBrace")
698    )
699    .add_struct(StructBuilder::new("ItemTypeAlias")
700        .node("attributes" ,"AttributeList")
701        .node("visibility", "Visibility")
702        .node("type_kw", "TerminalType")
703        .key_node("name", "TerminalIdentifier")
704        .node("generic_params", "OptionWrappedGenericParamList")
705        .node("eq", "TerminalEq")
706        .node("ty", "Expr")
707        .node("semicolon", "TerminalSemicolon")
708    )
709    .add_struct(StructBuilder::new("ItemUse")
710        .node("attributes" ,"AttributeList")
711        .node("visibility", "Visibility")
712        .node("use_kw", "TerminalUse")
713        .node("dollar", "OptionTerminalDollar")
714        .key_node("use_path", "UsePath")
715        .node("semicolon", "TerminalSemicolon")
716    )
717    .add_enum(
718        EnumBuilder::new("UsePath")
719        .node("Leaf")
720        .node("Single")
721        .node("Multi")
722        .node("Star")
723    )
724    .add_struct(StructBuilder::new("UsePathLeaf")
725        .key_node("ident", "PathSegment")
726        .key_node("alias_clause", "OptionAliasClause")
727    )
728    .add_struct(StructBuilder::new("UsePathSingle")
729        .node("ident", "PathSegment")
730        .node("colon_colon", "TerminalColonColon")
731        .node("use_path", "UsePath")
732    )
733    .add_struct(StructBuilder::new("UsePathMulti")
734        .node("lbrace", "TerminalLBrace")
735        .node("use_paths", "UsePathList")
736        .node("rbrace", "TerminalRBrace")
737    )
738    .add_struct(StructBuilder::new("UsePathStar")
739        .node("star", "TerminalMul")
740    )
741    .add_separated_list("UsePathList", "UsePath", "TerminalComma")
742    .add_struct(StructBuilder::new("AliasClause")
743        .node("as_kw", "TerminalAs")
744        .key_node("alias", "TerminalIdentifier")
745    )
746    .add_option("AliasClause")
747    .add_enum(
749        EnumBuilder::new("GenericArg")
750        .node("Unnamed")
751        .node("Named")
752    )
753    .add_struct(StructBuilder::new("GenericArgNamed")
754        .node("name", "TerminalIdentifier")
755        .node("colon", "TerminalColon")
756        .node("value", "GenericArgValue")
757    )
758    .add_struct(StructBuilder::new("GenericArgUnnamed")
759        .node("value", "GenericArgValue")
760    )
761    .add_enum(
762        EnumBuilder::new("GenericArgValue")
763        .node("Expr")
764        .node_with_explicit_kind("Underscore", "TerminalUnderscore")
765    )
766    .add_struct(StructBuilder::new("GenericArgValueExpr")
767        .node("expr", "Expr")
768    )
769    .add_struct(StructBuilder::new("GenericArgs")
770        .node("langle", "TerminalLT")
771        .node("generic_args", "GenericArgList")
772        .node("rangle", "TerminalGT")
773    )
774    .add_separated_list("GenericArgList", "GenericArg", "TerminalComma")
775    .add_struct(
776        StructBuilder::new("AssociatedItemConstraint")
777        .node("item","TerminalIdentifier")
778        .node("colon","TerminalColon")
779        .node("value","Expr")
780    )
781    .add_struct(StructBuilder::new("AssociatedItemConstraints")
782        .node("lbrack", "TerminalLBrack")
783        .node("associated_item_constraints", "AssociatedItemConstraintList")
784        .node("rbrack", "TerminalRBrack")
785    )
786    .add_separated_list("AssociatedItemConstraintList", "AssociatedItemConstraint", "TerminalComma")
787    .add_option("AssociatedItemConstraints")
788    .add_option("WrappedGenericParamList")
789    .add_struct(StructBuilder::new("WrappedGenericParamList")
790        .node("langle", "TerminalLT")
791        .node("generic_params", "GenericParamList")
792        .node("rangle", "TerminalGT")
793    )
794    .add_separated_list("GenericParamList", "GenericParam", "TerminalComma")
795    .add_enum(EnumBuilder::new("GenericParam")
797        .node("Type")
798        .node("Const")
799        .node("ImplNamed")
800        .node("ImplAnonymous")
801        .node("NegativeImpl")
802    )
803    .add_struct(StructBuilder::new("GenericParamType")
804        .key_node("name", "TerminalIdentifier")
805    )
806    .add_struct(StructBuilder::new("GenericParamConst")
807        .node("const_kw", "TerminalConst")
808        .key_node("name", "TerminalIdentifier")
809        .node("colon", "TerminalColon")
810        .node("ty", "Expr")
811    )
812    .add_struct(StructBuilder::new("GenericParamImplNamed")
813        .node("impl_kw", "TerminalImpl")
814        .key_node("name", "TerminalIdentifier")
815        .node("colon", "TerminalColon")
816        .node("trait_path", "ExprPath")
817        .node("type_constrains", "OptionAssociatedItemConstraints")
818    )
819    .add_struct(StructBuilder::new("GenericParamImplAnonymous")
820        .node("plus", "TerminalPlus")
821        .node("trait_path", "ExprPath")
822        .node("type_constrains", "OptionAssociatedItemConstraints")
823    )
824    .add_struct(StructBuilder::new("GenericParamNegativeImpl")
825        .node("minus", "TerminalMinus")
826        .node("trait_path", "ExprPath")
827    )
828    .add_list("TokenList", "TokenTree")
835    .add_struct(StructBuilder::new("TokenTreeLeaf")
836        .node("leaf", "TokenNode")
837    )
838    .add_struct(StructBuilder::new("TokenTreeNode")
839        .node("subtree", "WrappedTokenTree")
840    )
841    .add_struct(StructBuilder::new("TokenTreeRepetition")
843        .node("dollar", "TerminalDollar")
844        .node("lparen", "TerminalLParen")
845        .node("elements", "TokenList")
846        .node("rparen", "TerminalRParen")
847        .node("separator", "OptionTerminalComma")
848        .node("operator", "MacroRepetitionOperator")
849    )
850    .add_struct(StructBuilder::new("TokenTreeParam")
851        .node("dollar", "TerminalDollar")
852        .node("name", "TerminalIdentifier")
853    )
854    .add_enum(EnumBuilder::new("TokenTree")
855        .missing("Missing")
856        .node_with_explicit_kind("Token", "TokenTreeLeaf")
857        .node_with_explicit_kind("Subtree", "TokenTreeNode")
858        .node_with_explicit_kind("Repetition", "TokenTreeRepetition")
859        .node_with_explicit_kind("Param", "TokenTreeParam")
860    )
861    .add_struct(StructBuilder::new("TokenTreeMissing"))
862    .add_enum(EnumBuilder::new("WrappedTokenTree")
863        .missing("Missing")
864        .node_with_explicit_kind("Parenthesized", "ParenthesizedTokenTree")
865        .node_with_explicit_kind("Braced", "BracedTokenTree")
866        .node_with_explicit_kind("Bracketed", "BracketedTokenTree")
867    )
868    .add_struct(StructBuilder::new("WrappedTokenTreeMissing"))
869    .add_struct(StructBuilder::new("ParenthesizedTokenTree")
870        .node("lparen", "TerminalLParen")
871        .node("tokens", "TokenList")
872        .node("rparen", "TerminalRParen")
873    )
874    .add_struct(StructBuilder::new("BracedTokenTree")
875        .node("lbrace", "TerminalLBrace")
876        .node("tokens", "TokenList")
877        .node("rbrace", "TerminalRBrace")
878    )
879    .add_struct(StructBuilder::new("BracketedTokenTree")
880        .node("lbrack", "TerminalLBrack")
881        .node("tokens", "TokenList")
882        .node("rbrack", "TerminalRBrack")
883    )
884    .add_struct(StructBuilder::new("ExprInlineMacro")
885        .node("path", "ExprPath")
886        .node("bang", "TerminalNot")
887        .node("arguments", "TokenTreeNode")
888    )
889    .add_struct(StructBuilder::new("ItemInlineMacro")
890    .node("attributes" ,"AttributeList")
891    .node("path", "ExprPath")
892    .node("bang", "TerminalNot")
893    .node("arguments", "TokenTreeNode")
894    .node("semicolon", "TerminalSemicolon"))
895    .add_struct(StructBuilder::new("ItemMacroDeclaration")
896        .node("attributes" ,"AttributeList")
897        .node("visibility", "Visibility")
898        .node("macro_kw", "TerminalMacro")
899        .key_node("name", "TerminalIdentifier")
900        .node("lbrace", "TerminalLBrace")
901        .node("rules", "MacroRulesList")
902        .node("rbrace", "TerminalRBrace")
903    )
904    .add_list("MacroRulesList", "MacroRule")
905    .add_struct(StructBuilder::new("MacroRule")
906        .node("lhs", "WrappedMacro")
907        .node("fat_arrow", "TerminalMatchArrow")
908        .node("rhs", "BracedMacro")
909        .node("semicolon", "TerminalSemicolon")
910    )
911    .add_struct(StructBuilder::new("ParamKind")
912        .node("colon", "TerminalColon")
913        .node("kind", "MacroParamKind")
914    )
915    .add_option("ParamKind")
916    .add_struct(StructBuilder::new("MacroParam")
917        .node("dollar", "TerminalDollar")
918        .node("name", "TerminalIdentifier")
919        .node("kind", "OptionParamKind")
920    )
921    .add_struct(StructBuilder::new("MacroRepetition")
922        .node("dollar", "TerminalDollar")
923        .node("lparen", "TerminalLParen")
924        .node("elements", "MacroElements")
925        .node("rparen", "TerminalRParen")
926        .node("separator", "OptionTerminalComma")
928        .node("operator", "MacroRepetitionOperator")
929    )
930    .add_option("TerminalComma")
931    .add_enum(EnumBuilder::new("MacroRepetitionOperator")
932        .node_with_explicit_kind("ZeroOrOne", "TerminalQuestionMark")
933        .node_with_explicit_kind("OneOrMore", "TerminalPlus")
934        .node_with_explicit_kind("ZeroOrMore", "TerminalMul")
935        .missing("Missing")
936    )
937    .add_struct(StructBuilder::new("MacroRepetitionOperatorMissing"))
938    .add_struct(StructBuilder::new("ParamIdent")
940        .node("ident", "TerminalIdentifier")
941    )
942    .add_struct(StructBuilder::new("ParamExpr")
943        .node("expr", "TerminalIdentifier")
944    )
945    .add_enum(EnumBuilder::new("MacroParamKind")
946        .node_with_explicit_kind("Identifier", "ParamIdent")
947        .node_with_explicit_kind("Expr", "ParamExpr")
948        .missing("Missing")
949    )
950    .add_struct(StructBuilder::new("MacroParamKindMissing"))
951    .add_enum(EnumBuilder::new("MacroElement")
952        .node_with_explicit_kind("Token", "TokenTreeLeaf")
953        .node_with_explicit_kind("Param", "MacroParam")
954        .node_with_explicit_kind("Subtree", "MacroWrapper")
955        .node_with_explicit_kind("Repetition", "MacroRepetition")
956    )
957    .add_list("MacroElements", "MacroElement")
958    .add_struct(StructBuilder::new("MacroWrapper")
959        .node("subtree", "WrappedMacro")
960    )
961    .add_enum(EnumBuilder::new("WrappedMacro")
962        .node_with_explicit_kind("Parenthesized", "ParenthesizedMacro")
963        .node_with_explicit_kind("Braced", "BracedMacro")
964        .node_with_explicit_kind("Bracketed", "BracketedMacro")
965    )
966    .add_struct(StructBuilder::new("ParenthesizedMacro")
967        .node("lparen", "TerminalLParen")
968        .node("elements", "MacroElements")
969        .node("rparen", "TerminalRParen")
970    )
971    .add_struct(StructBuilder::new("BracedMacro")
972        .node("lbrace", "TerminalLBrace")
973        .node("elements", "MacroElements")
974        .node("rbrace", "TerminalRBrace")
975    )
976    .add_struct(StructBuilder::new("BracketedMacro")
977        .node("lbrack", "TerminalLBrack")
978        .node("elements", "MacroElements")
979        .node("rbrack", "TerminalRBrack")
980    )
981    .add_struct(StructBuilder::new("LegacyExprInlineMacro")
982        .node("path", "ExprPath")
983        .node("bang", "TerminalNot")
984        .node("arguments", "WrappedArgList")
985    )
986    .add_struct(StructBuilder::new("LegacyItemInlineMacro")
987        .node("attributes" ,"AttributeList")
988        .node("path", "ExprPath")
989        .node("bang", "TerminalNot")
990        .node("arguments", "WrappedArgList")
991        .node("semicolon", "TerminalSemicolon"))
992    .add_struct(StructBuilder::new("TriviumSkippedNode")
995        .node("node", "SkippedNode")
996    )
997    .add_enum(EnumBuilder::new("SkippedNode")
999        .node_with_explicit_kind("AttributeList", "AttributeList")
1000        .node_with_explicit_kind("VisibilityPub", "VisibilityPub")
1001        .node_with_explicit_kind("ExprPath", "ExprPath")
1002    )
1003    .add_token_and_terminal("Identifier")
1005    .add_token_and_terminal("LiteralNumber")
1006    .add_token_and_terminal("ShortString")
1007    .add_token_and_terminal("String")
1008    .add_keyword_token_and_terminal("As")
1009    .add_keyword_token_and_terminal("Const")
1010    .add_keyword_token_and_terminal("Else")
1011    .add_keyword_token_and_terminal("Enum")
1012    .add_keyword_token_and_terminal("Extern")
1013    .add_keyword_token_and_terminal("False")
1014    .add_keyword_token_and_terminal("Function")
1015    .add_keyword_token_and_terminal("If")
1016    .add_keyword_token_and_terminal("While")
1017    .add_keyword_token_and_terminal("For")
1018    .add_keyword_token_and_terminal("Loop")
1019    .add_keyword_token_and_terminal("Impl")
1020    .add_keyword_token_and_terminal("Implicits")
1021    .add_keyword_token_and_terminal("Let")
1022    .add_keyword_token_and_terminal("Macro")
1023    .add_keyword_token_and_terminal("Match")
1024    .add_keyword_token_and_terminal("Module")
1025    .add_keyword_token_and_terminal("Mut")
1026    .add_keyword_token_and_terminal("NoPanic")
1027    .add_keyword_token_and_terminal("Of")
1028    .add_keyword_token_and_terminal("Ref")
1029    .add_keyword_token_and_terminal("Continue")
1030    .add_keyword_token_and_terminal("Return")
1031    .add_keyword_token_and_terminal("Break")
1032    .add_keyword_token_and_terminal("Struct")
1033    .add_keyword_token_and_terminal("Trait")
1034    .add_keyword_token_and_terminal("True")
1035    .add_keyword_token_and_terminal("Type")
1036    .add_keyword_token_and_terminal("Use")
1037    .add_keyword_token_and_terminal("Pub")
1038    .add_token_and_terminal("And")
1039    .add_token_and_terminal("AndAnd")
1040    .add_token_and_terminal("Arrow")
1041    .add_token_and_terminal("At")
1042    .add_token_and_terminal("BadCharacters")
1043    .add_token_and_terminal("Colon")
1044    .add_token_and_terminal("ColonColon")
1045    .add_token_and_terminal("Comma")
1046    .add_token_and_terminal("Div")
1047    .add_token_and_terminal("DivEq")
1048    .add_token_and_terminal("Dollar")
1049    .add_token_and_terminal("Dot")
1050    .add_token_and_terminal("DotDot")
1051    .add_token_and_terminal("DotDotEq")
1052    .add_token_and_terminal("EndOfFile")
1053    .add_token_and_terminal("Eq")
1054    .add_token_and_terminal("EqEq")
1055    .add_token_and_terminal("GE")
1056    .add_token_and_terminal("GT")
1057    .add_token_and_terminal("Hash")
1058    .add_token_and_terminal("LBrace")
1059    .add_token_and_terminal("LBrack")
1060    .add_token_and_terminal("LE")
1061    .add_token_and_terminal("LParen")
1062    .add_token_and_terminal("LT")
1063    .add_token_and_terminal("MatchArrow")
1064    .add_token_and_terminal("Minus")
1065    .add_token_and_terminal("MinusEq")
1066    .add_token_and_terminal("Mod")
1067    .add_token_and_terminal("ModEq")
1068    .add_token_and_terminal("Mul")
1069    .add_token_and_terminal("MulEq")
1070    .add_token_and_terminal("Neq")
1071    .add_token_and_terminal("Not")
1072    .add_token_and_terminal("BitNot")
1073    .add_token_and_terminal("Or")
1074    .add_token_and_terminal("OrOr")
1075    .add_token_and_terminal("Plus")
1076    .add_token_and_terminal("PlusEq")
1077    .add_token_and_terminal("QuestionMark")
1078    .add_token_and_terminal("RBrace")
1079    .add_token_and_terminal("RBrack")
1080    .add_token_and_terminal("RParen")
1081    .add_token_and_terminal("Semicolon")
1082    .add_token_and_terminal("Underscore")
1083    .add_token_and_terminal("Xor")
1084    .add_struct(StructBuilder::new("SyntaxFile")
1086        .node("items", "ModuleItemList")
1087        .node("eof", "TerminalEndOfFile")
1088    )
1089    .add_token_and_terminal("Empty")
1090    .add_token("SingleLineComment")
1091    .add_token("SingleLineInnerComment")
1092    .add_token("SingleLineDocComment")
1093    .add_token("Whitespace")
1094    .add_token("Newline")
1095    .add_token("Missing")
1096    .add_token("Skipped")
1097    .add_all_tokens_enum("TokenNode")
1098    .get()
1099}