cairo-lang-parser 2.18.0

Cairo parser.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
//! > Test a syntax tree with literals

//! > test_runner_name
test_partial_parser_tree(expect_diagnostics: false)

//! > cairo_code
fn test() {
    println!('foo');
}

//! > top_level_kind
ExprInlineMacro

//! > ignored_kinds

//! > expected_diagnostics

//! > expected_tree
└── Top level kind: ExprInlineMacro
    ├── path (kind: ExprPath)
    │   ├── dollar (kind: OptionTerminalDollarEmpty) []
    │   └── segments (kind: ExprPathInner)
    │       └── item #0 (kind: PathSegmentSimple)
    │           └── ident (kind: TokenIdentifier): 'println'
    ├── bang (kind: TokenNot): '!'
    └── arguments (kind: TokenTreeNode)
        └── subtree (kind: ParenthesizedTokenTree)
            ├── lparen (kind: TokenLParen): '('
            ├── tokens (kind: TokenList)
            │   └── child #0 (kind: TokenTreeLeaf)
            │       └── leaf (kind: TokenShortString): ''foo''
            └── rparen (kind: TokenRParen): ')'

//! > ==========================================================================

//! > Test a syntax tree with subtree

//! > test_runner_name
test_partial_parser_tree(expect_diagnostics: false)

//! > cairo_code
macro some_macro {
    (a + b + $x:ident + ($y:ident + (1 + 2))) => {
        1
    };
}

//! > top_level_kind

//! > ignored_kinds

//! > expected_diagnostics

//! > expected_tree
└── root (kind: SyntaxFile)
    ├── items (kind: ModuleItemList)
    │   └── child #0 (kind: ItemMacroDeclaration)
    │       ├── attributes (kind: AttributeList) []
    │       ├── visibility (kind: VisibilityDefault) []
    │       ├── macro_kw (kind: TokenMacro): 'macro'
    │       ├── name (kind: TokenIdentifier): 'some_macro'
    │       ├── lbrace (kind: TokenLBrace): '{'
    │       ├── rules (kind: MacroRulesList)
    │       │   └── child #0 (kind: MacroRule)
    │       │       ├── lhs (kind: ParenthesizedMacro)
    │       │       │   ├── lparen (kind: TokenLParen): '('
    │       │       │   ├── elements (kind: MacroElements)
    │       │       │   │   ├── child #0 (kind: TokenTreeLeaf)
    │       │       │   │   │   └── leaf (kind: TokenIdentifier): 'a'
    │       │       │   │   ├── child #1 (kind: TokenTreeLeaf)
    │       │       │   │   │   └── leaf (kind: TokenPlus): '+'
    │       │       │   │   ├── child #2 (kind: TokenTreeLeaf)
    │       │       │   │   │   └── leaf (kind: TokenIdentifier): 'b'
    │       │       │   │   ├── child #3 (kind: TokenTreeLeaf)
    │       │       │   │   │   └── leaf (kind: TokenPlus): '+'
    │       │       │   │   ├── child #4 (kind: MacroParam)
    │       │       │   │   │   ├── dollar (kind: TokenDollar): '$'
    │       │       │   │   │   ├── name (kind: TokenIdentifier): 'x'
    │       │       │   │   │   └── kind (kind: ParamKind)
    │       │       │   │   │       ├── colon (kind: TokenColon): ':'
    │       │       │   │   │       └── kind (kind: ParamIdent)
    │       │       │   │   │           └── ident (kind: TokenIdentifier): 'ident'
    │       │       │   │   ├── child #5 (kind: TokenTreeLeaf)
    │       │       │   │   │   └── leaf (kind: TokenPlus): '+'
    │       │       │   │   └── child #6 (kind: MacroWrapper)
    │       │       │   │       └── subtree (kind: ParenthesizedMacro)
    │       │       │   │           ├── lparen (kind: TokenLParen): '('
    │       │       │   │           ├── elements (kind: MacroElements)
    │       │       │   │           │   ├── child #0 (kind: MacroParam)
    │       │       │   │           │   │   ├── dollar (kind: TokenDollar): '$'
    │       │       │   │           │   │   ├── name (kind: TokenIdentifier): 'y'
    │       │       │   │           │   │   └── kind (kind: ParamKind)
    │       │       │   │           │   │       ├── colon (kind: TokenColon): ':'
    │       │       │   │           │   │       └── kind (kind: ParamIdent)
    │       │       │   │           │   │           └── ident (kind: TokenIdentifier): 'ident'
    │       │       │   │           │   ├── child #1 (kind: TokenTreeLeaf)
    │       │       │   │           │   │   └── leaf (kind: TokenPlus): '+'
    │       │       │   │           │   └── child #2 (kind: MacroWrapper)
    │       │       │   │           │       └── subtree (kind: ParenthesizedMacro)
    │       │       │   │           │           ├── lparen (kind: TokenLParen): '('
    │       │       │   │           │           ├── elements (kind: MacroElements)
    │       │       │   │           │           │   ├── child #0 (kind: TokenTreeLeaf)
    │       │       │   │           │           │   │   └── leaf (kind: TokenLiteralNumber): '1'
    │       │       │   │           │           │   ├── child #1 (kind: TokenTreeLeaf)
    │       │       │   │           │           │   │   └── leaf (kind: TokenPlus): '+'
    │       │       │   │           │           │   └── child #2 (kind: TokenTreeLeaf)
    │       │       │   │           │           │       └── leaf (kind: TokenLiteralNumber): '2'
    │       │       │   │           │           └── rparen (kind: TokenRParen): ')'
    │       │       │   │           └── rparen (kind: TokenRParen): ')'
    │       │       │   └── rparen (kind: TokenRParen): ')'
    │       │       ├── fat_arrow (kind: TokenMatchArrow): '=>'
    │       │       ├── rhs (kind: BracedMacro)
    │       │       │   ├── lbrace (kind: TokenLBrace): '{'
    │       │       │   ├── elements (kind: MacroElements)
    │       │       │   │   └── child #0 (kind: TokenTreeLeaf)
    │       │       │   │       └── leaf (kind: TokenLiteralNumber): '1'
    │       │       │   └── rbrace (kind: TokenRBrace): '}'
    │       │       └── semicolon (kind: TokenSemicolon): ';'
    │       └── rbrace (kind: TokenRBrace): '}'
    └── eof (kind: TokenEndOfFile).

//! > ==========================================================================

//! > Test a syntax tree with repetition operators

//! > test_runner_name
test_partial_parser_tree(expect_diagnostics: false)

//! > cairo_code
macro some_macro {
    ($($x:ident), +) => {
        1
    };

    ($($x:expr), *) => {
        1
    };

    ($($x:expr)?) => {
        1
    };

    ($($x:ident) +) => {
        1
    };

    ($($x:expr), *) => {
        foo!($($x), *)
    };
}

fn use_macro() {
    some_macro!(100);
}

//! > top_level_kind

//! > ignored_kinds

//! > expected_diagnostics

//! > expected_tree
└── root (kind: SyntaxFile)
    ├── items (kind: ModuleItemList)
    │   ├── child #0 (kind: ItemMacroDeclaration)
    │   │   ├── attributes (kind: AttributeList) []
    │   │   ├── visibility (kind: VisibilityDefault) []
    │   │   ├── macro_kw (kind: TokenMacro): 'macro'
    │   │   ├── name (kind: TokenIdentifier): 'some_macro'
    │   │   ├── lbrace (kind: TokenLBrace): '{'
    │   │   ├── rules (kind: MacroRulesList)
    │   │   │   ├── child #0 (kind: MacroRule)
    │   │   │   │   ├── lhs (kind: ParenthesizedMacro)
    │   │   │   │   │   ├── lparen (kind: TokenLParen): '('
    │   │   │   │   │   ├── elements (kind: MacroElements)
    │   │   │   │   │   │   └── child #0 (kind: MacroRepetition)
    │   │   │   │   │   │       ├── dollar (kind: TokenDollar): '$'
    │   │   │   │   │   │       ├── lparen (kind: TokenLParen): '('
    │   │   │   │   │   │       ├── elements (kind: MacroElements)
    │   │   │   │   │   │       │   └── child #0 (kind: MacroParam)
    │   │   │   │   │   │       │       ├── dollar (kind: TokenDollar): '$'
    │   │   │   │   │   │       │       ├── name (kind: TokenIdentifier): 'x'
    │   │   │   │   │   │       │       └── kind (kind: ParamKind)
    │   │   │   │   │   │       │           ├── colon (kind: TokenColon): ':'
    │   │   │   │   │   │       │           └── kind (kind: ParamIdent)
    │   │   │   │   │   │       │               └── ident (kind: TokenIdentifier): 'ident'
    │   │   │   │   │   │       ├── rparen (kind: TokenRParen): ')'
    │   │   │   │   │   │       ├── separator (kind: TokenComma): ','
    │   │   │   │   │   │       └── operator (kind: TokenPlus): '+'
    │   │   │   │   │   └── rparen (kind: TokenRParen): ')'
    │   │   │   │   ├── fat_arrow (kind: TokenMatchArrow): '=>'
    │   │   │   │   ├── rhs (kind: BracedMacro)
    │   │   │   │   │   ├── lbrace (kind: TokenLBrace): '{'
    │   │   │   │   │   ├── elements (kind: MacroElements)
    │   │   │   │   │   │   └── child #0 (kind: TokenTreeLeaf)
    │   │   │   │   │   │       └── leaf (kind: TokenLiteralNumber): '1'
    │   │   │   │   │   └── rbrace (kind: TokenRBrace): '}'
    │   │   │   │   └── semicolon (kind: TokenSemicolon): ';'
    │   │   │   ├── child #1 (kind: MacroRule)
    │   │   │   │   ├── lhs (kind: ParenthesizedMacro)
    │   │   │   │   │   ├── lparen (kind: TokenLParen): '('
    │   │   │   │   │   ├── elements (kind: MacroElements)
    │   │   │   │   │   │   └── child #0 (kind: MacroRepetition)
    │   │   │   │   │   │       ├── dollar (kind: TokenDollar): '$'
    │   │   │   │   │   │       ├── lparen (kind: TokenLParen): '('
    │   │   │   │   │   │       ├── elements (kind: MacroElements)
    │   │   │   │   │   │       │   └── child #0 (kind: MacroParam)
    │   │   │   │   │   │       │       ├── dollar (kind: TokenDollar): '$'
    │   │   │   │   │   │       │       ├── name (kind: TokenIdentifier): 'x'
    │   │   │   │   │   │       │       └── kind (kind: ParamKind)
    │   │   │   │   │   │       │           ├── colon (kind: TokenColon): ':'
    │   │   │   │   │   │       │           └── kind (kind: ParamExpr)
    │   │   │   │   │   │       │               └── expr (kind: TokenIdentifier): 'expr'
    │   │   │   │   │   │       ├── rparen (kind: TokenRParen): ')'
    │   │   │   │   │   │       ├── separator (kind: TokenComma): ','
    │   │   │   │   │   │       └── operator (kind: TokenMul): '*'
    │   │   │   │   │   └── rparen (kind: TokenRParen): ')'
    │   │   │   │   ├── fat_arrow (kind: TokenMatchArrow): '=>'
    │   │   │   │   ├── rhs (kind: BracedMacro)
    │   │   │   │   │   ├── lbrace (kind: TokenLBrace): '{'
    │   │   │   │   │   ├── elements (kind: MacroElements)
    │   │   │   │   │   │   └── child #0 (kind: TokenTreeLeaf)
    │   │   │   │   │   │       └── leaf (kind: TokenLiteralNumber): '1'
    │   │   │   │   │   └── rbrace (kind: TokenRBrace): '}'
    │   │   │   │   └── semicolon (kind: TokenSemicolon): ';'
    │   │   │   ├── child #2 (kind: MacroRule)
    │   │   │   │   ├── lhs (kind: ParenthesizedMacro)
    │   │   │   │   │   ├── lparen (kind: TokenLParen): '('
    │   │   │   │   │   ├── elements (kind: MacroElements)
    │   │   │   │   │   │   └── child #0 (kind: MacroRepetition)
    │   │   │   │   │   │       ├── dollar (kind: TokenDollar): '$'
    │   │   │   │   │   │       ├── lparen (kind: TokenLParen): '('
    │   │   │   │   │   │       ├── elements (kind: MacroElements)
    │   │   │   │   │   │       │   └── child #0 (kind: MacroParam)
    │   │   │   │   │   │       │       ├── dollar (kind: TokenDollar): '$'
    │   │   │   │   │   │       │       ├── name (kind: TokenIdentifier): 'x'
    │   │   │   │   │   │       │       └── kind (kind: ParamKind)
    │   │   │   │   │   │       │           ├── colon (kind: TokenColon): ':'
    │   │   │   │   │   │       │           └── kind (kind: ParamExpr)
    │   │   │   │   │   │       │               └── expr (kind: TokenIdentifier): 'expr'
    │   │   │   │   │   │       ├── rparen (kind: TokenRParen): ')'
    │   │   │   │   │   │       ├── separator (kind: OptionTerminalCommaEmpty) []
    │   │   │   │   │   │       └── operator (kind: TokenQuestionMark): '?'
    │   │   │   │   │   └── rparen (kind: TokenRParen): ')'
    │   │   │   │   ├── fat_arrow (kind: TokenMatchArrow): '=>'
    │   │   │   │   ├── rhs (kind: BracedMacro)
    │   │   │   │   │   ├── lbrace (kind: TokenLBrace): '{'
    │   │   │   │   │   ├── elements (kind: MacroElements)
    │   │   │   │   │   │   └── child #0 (kind: TokenTreeLeaf)
    │   │   │   │   │   │       └── leaf (kind: TokenLiteralNumber): '1'
    │   │   │   │   │   └── rbrace (kind: TokenRBrace): '}'
    │   │   │   │   └── semicolon (kind: TokenSemicolon): ';'
    │   │   │   ├── child #3 (kind: MacroRule)
    │   │   │   │   ├── lhs (kind: ParenthesizedMacro)
    │   │   │   │   │   ├── lparen (kind: TokenLParen): '('
    │   │   │   │   │   ├── elements (kind: MacroElements)
    │   │   │   │   │   │   └── child #0 (kind: MacroRepetition)
    │   │   │   │   │   │       ├── dollar (kind: TokenDollar): '$'
    │   │   │   │   │   │       ├── lparen (kind: TokenLParen): '('
    │   │   │   │   │   │       ├── elements (kind: MacroElements)
    │   │   │   │   │   │       │   └── child #0 (kind: MacroParam)
    │   │   │   │   │   │       │       ├── dollar (kind: TokenDollar): '$'
    │   │   │   │   │   │       │       ├── name (kind: TokenIdentifier): 'x'
    │   │   │   │   │   │       │       └── kind (kind: ParamKind)
    │   │   │   │   │   │       │           ├── colon (kind: TokenColon): ':'
    │   │   │   │   │   │       │           └── kind (kind: ParamIdent)
    │   │   │   │   │   │       │               └── ident (kind: TokenIdentifier): 'ident'
    │   │   │   │   │   │       ├── rparen (kind: TokenRParen): ')'
    │   │   │   │   │   │       ├── separator (kind: OptionTerminalCommaEmpty) []
    │   │   │   │   │   │       └── operator (kind: TokenPlus): '+'
    │   │   │   │   │   └── rparen (kind: TokenRParen): ')'
    │   │   │   │   ├── fat_arrow (kind: TokenMatchArrow): '=>'
    │   │   │   │   ├── rhs (kind: BracedMacro)
    │   │   │   │   │   ├── lbrace (kind: TokenLBrace): '{'
    │   │   │   │   │   ├── elements (kind: MacroElements)
    │   │   │   │   │   │   └── child #0 (kind: TokenTreeLeaf)
    │   │   │   │   │   │       └── leaf (kind: TokenLiteralNumber): '1'
    │   │   │   │   │   └── rbrace (kind: TokenRBrace): '}'
    │   │   │   │   └── semicolon (kind: TokenSemicolon): ';'
    │   │   │   └── child #4 (kind: MacroRule)
    │   │   │       ├── lhs (kind: ParenthesizedMacro)
    │   │   │       │   ├── lparen (kind: TokenLParen): '('
    │   │   │       │   ├── elements (kind: MacroElements)
    │   │   │       │   │   └── child #0 (kind: MacroRepetition)
    │   │   │       │   │       ├── dollar (kind: TokenDollar): '$'
    │   │   │       │   │       ├── lparen (kind: TokenLParen): '('
    │   │   │       │   │       ├── elements (kind: MacroElements)
    │   │   │       │   │       │   └── child #0 (kind: MacroParam)
    │   │   │       │   │       │       ├── dollar (kind: TokenDollar): '$'
    │   │   │       │   │       │       ├── name (kind: TokenIdentifier): 'x'
    │   │   │       │   │       │       └── kind (kind: ParamKind)
    │   │   │       │   │       │           ├── colon (kind: TokenColon): ':'
    │   │   │       │   │       │           └── kind (kind: ParamExpr)
    │   │   │       │   │       │               └── expr (kind: TokenIdentifier): 'expr'
    │   │   │       │   │       ├── rparen (kind: TokenRParen): ')'
    │   │   │       │   │       ├── separator (kind: TokenComma): ','
    │   │   │       │   │       └── operator (kind: TokenMul): '*'
    │   │   │       │   └── rparen (kind: TokenRParen): ')'
    │   │   │       ├── fat_arrow (kind: TokenMatchArrow): '=>'
    │   │   │       ├── rhs (kind: BracedMacro)
    │   │   │       │   ├── lbrace (kind: TokenLBrace): '{'
    │   │   │       │   ├── elements (kind: MacroElements)
    │   │   │       │   │   ├── child #0 (kind: TokenTreeLeaf)
    │   │   │       │   │   │   └── leaf (kind: TokenIdentifier): 'foo'
    │   │   │       │   │   ├── child #1 (kind: TokenTreeLeaf)
    │   │   │       │   │   │   └── leaf (kind: TokenNot): '!'
    │   │   │       │   │   └── child #2 (kind: MacroWrapper)
    │   │   │       │   │       └── subtree (kind: ParenthesizedMacro)
    │   │   │       │   │           ├── lparen (kind: TokenLParen): '('
    │   │   │       │   │           ├── elements (kind: MacroElements)
    │   │   │       │   │           │   └── child #0 (kind: MacroRepetition)
    │   │   │       │   │           │       ├── dollar (kind: TokenDollar): '$'
    │   │   │       │   │           │       ├── lparen (kind: TokenLParen): '('
    │   │   │       │   │           │       ├── elements (kind: MacroElements)
    │   │   │       │   │           │       │   └── child #0 (kind: MacroParam)
    │   │   │       │   │           │       │       ├── dollar (kind: TokenDollar): '$'
    │   │   │       │   │           │       │       ├── name (kind: TokenIdentifier): 'x'
    │   │   │       │   │           │       │       └── kind (kind: OptionParamKindEmpty) []
    │   │   │       │   │           │       ├── rparen (kind: TokenRParen): ')'
    │   │   │       │   │           │       ├── separator (kind: TokenComma): ','
    │   │   │       │   │           │       └── operator (kind: TokenMul): '*'
    │   │   │       │   │           └── rparen (kind: TokenRParen): ')'
    │   │   │       │   └── rbrace (kind: TokenRBrace): '}'
    │   │   │       └── semicolon (kind: TokenSemicolon): ';'
    │   │   └── rbrace (kind: TokenRBrace): '}'
    │   └── child #1 (kind: FunctionWithBody)
    │       ├── attributes (kind: AttributeList) []
    │       ├── visibility (kind: VisibilityDefault) []
    │       ├── declaration (kind: FunctionDeclaration)
    │       │   ├── optional_const (kind: OptionTerminalConstEmpty) []
    │       │   ├── function_kw (kind: TokenFunction): 'fn'
    │       │   ├── name (kind: TokenIdentifier): 'use_macro'
    │       │   ├── generic_params (kind: OptionWrappedGenericParamListEmpty) []
    │       │   └── signature (kind: FunctionSignature)
    │       │       ├── lparen (kind: TokenLParen): '('
    │       │       ├── parameters (kind: ParamList) []
    │       │       ├── rparen (kind: TokenRParen): ')'
    │       │       ├── ret_ty (kind: OptionReturnTypeClauseEmpty) []
    │       │       ├── implicits_clause (kind: OptionImplicitsClauseEmpty) []
    │       │       └── optional_no_panic (kind: OptionTerminalNoPanicEmpty) []
    │       └── body (kind: ExprBlock)
    │           ├── lbrace (kind: TokenLBrace): '{'
    │           ├── statements (kind: StatementList)
    │           │   └── child #0 (kind: StatementExpr)
    │           │       ├── attributes (kind: AttributeList) []
    │           │       ├── expr (kind: ExprInlineMacro)
    │           │       │   ├── path (kind: ExprPath)
    │           │       │   │   ├── dollar (kind: OptionTerminalDollarEmpty) []
    │           │       │   │   └── segments (kind: ExprPathInner)
    │           │       │   │       └── item #0 (kind: PathSegmentSimple)
    │           │       │   │           └── ident (kind: TokenIdentifier): 'some_macro'
    │           │       │   ├── bang (kind: TokenNot): '!'
    │           │       │   └── arguments (kind: TokenTreeNode)
    │           │       │       └── subtree (kind: ParenthesizedTokenTree)
    │           │       │           ├── lparen (kind: TokenLParen): '('
    │           │       │           ├── tokens (kind: TokenList)
    │           │       │           │   └── child #0 (kind: TokenTreeLeaf)
    │           │       │           │       └── leaf (kind: TokenLiteralNumber): '100'
    │           │       │           └── rparen (kind: TokenRParen): ')'
    │           │       └── semicolon (kind: TokenSemicolon): ';'
    │           └── rbrace (kind: TokenRBrace): '}'
    └── eof (kind: TokenEndOfFile).

//! > ==========================================================================

//! > Test a syntax tree with bad rule.

//! > test_runner_name
test_partial_parser_tree(expect_diagnostics: true)

//! > cairo_code
macro some_macro {
    () => (bad prefix {
        1
    };
    () => no-rule
}

//! > top_level_kind

//! > ignored_kinds

//! > expected_diagnostics
error[E1000]: Skipped tokens. Expected: '{'.
 --> dummy_file.cairo:2:11
    () => (bad prefix {
          ^^^^^^^^^^^

error[E1000]: Skipped tokens. Expected: '{'.
 --> dummy_file.cairo:5:11
    () => no-rule
          ^^^^^^^

error[E1001]: Missing token '{'.
 --> dummy_file.cairo:5:18
    () => no-rule
                 ^

error[E1001]: Missing token '}'.
 --> dummy_file.cairo:5:18
    () => no-rule
                 ^

error[E1001]: Missing token ';'.
 --> dummy_file.cairo:5:18
    () => no-rule
                 ^

//! > expected_tree
└── root (kind: SyntaxFile)
    ├── items (kind: ModuleItemList)
    │   └── child #0 (kind: ItemMacroDeclaration)
    │       ├── attributes (kind: AttributeList) []
    │       ├── visibility (kind: VisibilityDefault) []
    │       ├── macro_kw (kind: TokenMacro): 'macro'
    │       ├── name (kind: TokenIdentifier): 'some_macro'
    │       ├── lbrace (kind: TokenLBrace): '{'
    │       ├── rules (kind: MacroRulesList)
    │       │   ├── child #0 (kind: MacroRule)
    │       │   │   ├── lhs (kind: ParenthesizedMacro)
    │       │   │   │   ├── lparen (kind: TokenLParen): '('
    │       │   │   │   ├── elements (kind: MacroElements) []
    │       │   │   │   └── rparen (kind: TokenRParen): ')'
    │       │   │   ├── fat_arrow (kind: TokenMatchArrow): '=>'
    │       │   │   ├── rhs (kind: BracedMacro)
    │       │   │   │   ├── lbrace (kind: TokenLBrace): '{'
    │       │   │   │   ├── elements (kind: MacroElements)
    │       │   │   │   │   └── child #0 (kind: TokenTreeLeaf)
    │       │   │   │   │       └── leaf (kind: TokenLiteralNumber): '1'
    │       │   │   │   └── rbrace (kind: TokenRBrace): '}'
    │       │   │   └── semicolon (kind: TokenSemicolon): ';'
    │       │   └── child #1 (kind: MacroRule)
    │       │       ├── lhs (kind: ParenthesizedMacro)
    │       │       │   ├── lparen (kind: TokenLParen): '('
    │       │       │   ├── elements (kind: MacroElements) []
    │       │       │   └── rparen (kind: TokenRParen): ')'
    │       │       ├── fat_arrow (kind: TokenMatchArrow): '=>'
    │       │       ├── rhs (kind: BracedMacro)
    │       │       │   ├── lbrace: Missing
    │       │       │   ├── elements (kind: MacroElements) []
    │       │       │   └── rbrace: Missing
    │       │       └── semicolon: Missing
    │       └── rbrace (kind: TokenRBrace): '}'
    └── eof (kind: TokenEndOfFile).