@@ -152,7 +152,7 @@ void parse(CapturingTokenizer tokenizer) {
152
152
@ Override
153
153
void parse (CapturingTokenizer tokenizer ) {
154
154
tokenizer .withState (this , () -> {
155
- tokenizer .next ();
155
+ tokenizer .next (); // Skip "use"
156
156
SP .parse (tokenizer );
157
157
ABSOLUTE_ROOT_SHAPE_ID .parse (tokenizer );
158
158
BR .parse (tokenizer );
@@ -236,22 +236,16 @@ void parse(CapturingTokenizer tokenizer) {
236
236
@ Override
237
237
void parse (CapturingTokenizer tokenizer ) {
238
238
tokenizer .withState (this , () -> {
239
- SIMPLE_TYPE_NAME .parse (tokenizer );
240
- optionalSpaces (tokenizer );
241
- IDENTIFIER .parse (tokenizer );
242
- optionalSpaces (tokenizer );
243
-
244
- if (tokenizer .isCurrentLexeme ("with" )) {
245
- SHAPE_MIXINS .parse (tokenizer );
246
- }
239
+ parseShapeTypeAndName (tokenizer , SIMPLE_TYPE_NAME );
240
+ parseOptionalMixins (tokenizer );
247
241
});
248
242
}
249
243
},
250
244
251
245
SIMPLE_TYPE_NAME {
252
246
@ Override
253
247
void parse (CapturingTokenizer tokenizer ) {
254
- // Assumes that the current token is a valid simple type name validated by SHAPE_BODY .
248
+ // Assumes that the current token is a valid simple type name validated by SHAPE .
255
249
tokenizer .withState (this , tokenizer ::next );
256
250
}
257
251
},
@@ -260,14 +254,8 @@ void parse(CapturingTokenizer tokenizer) {
260
254
@ Override
261
255
void parse (CapturingTokenizer tokenizer ) {
262
256
tokenizer .withState (this , () -> {
263
- ENUM_TYPE_NAME .parse (tokenizer );
264
- optionalSpaces (tokenizer );
265
- IDENTIFIER .parse (tokenizer );
266
- optionalSpaces (tokenizer );
267
-
268
- if (tokenizer .isCurrentLexeme ("with" )) {
269
- SHAPE_MIXINS .parse (tokenizer );
270
- }
257
+ parseShapeTypeAndName (tokenizer , ENUM_TYPE_NAME );
258
+ parseOptionalMixins (tokenizer );
271
259
272
260
optionalWs (tokenizer );
273
261
ENUM_SHAPE_MEMBERS .parse (tokenizer );
@@ -278,7 +266,7 @@ void parse(CapturingTokenizer tokenizer) {
278
266
ENUM_TYPE_NAME {
279
267
@ Override
280
268
void parse (CapturingTokenizer tokenizer ) {
281
- // Assumes that the current token is a valid enum type name validated by SHAPE_BODY .
269
+ // Assumes that the current token is a valid enum type name validated by SHAPE .
282
270
tokenizer .withState (this , tokenizer ::next );
283
271
}
284
272
},
@@ -308,10 +296,7 @@ void parse(CapturingTokenizer tokenizer) {
308
296
tokenizer .withState (this , () -> {
309
297
TRAIT_STATEMENTS .parse (tokenizer );
310
298
IDENTIFIER .parse (tokenizer );
311
- if (tokenizer .hasNext () && (tokenizer .getCurrentToken () == IdlToken .EQUAL
312
- || tokenizer .peekPastSpaces ().getIdlToken () == IdlToken .EQUAL )) {
313
- VALUE_ASSIGNMENT .parse (tokenizer );
314
- }
299
+ parseOptionalValueAssignment (tokenizer );
315
300
});
316
301
}
317
302
},
@@ -320,10 +305,7 @@ void parse(CapturingTokenizer tokenizer) {
320
305
@ Override
321
306
void parse (CapturingTokenizer tokenizer ) {
322
307
tokenizer .withState (this , () -> {
323
- AGGREGATE_TYPE_NAME .parse (tokenizer );
324
- optionalSpaces (tokenizer );
325
- IDENTIFIER .parse (tokenizer );
326
- optionalSpaces (tokenizer );
308
+ parseShapeTypeAndName (tokenizer , AGGREGATE_TYPE_NAME );
327
309
parseSharedStructureBodyWithinInline (tokenizer );
328
310
});
329
311
}
@@ -332,16 +314,17 @@ void parse(CapturingTokenizer tokenizer) {
332
314
AGGREGATE_TYPE_NAME {
333
315
@ Override
334
316
void parse (CapturingTokenizer tokenizer ) {
335
- // Assumes that the current token is a valid simple type name validated by SHAPE_BODY .
317
+ // Assumes that the current token is a valid simple type name validated by SHAPE .
336
318
tokenizer .withState (this , tokenizer ::next );
337
319
}
338
320
},
339
321
340
- AGGREGATE_SHAPE_RESOURCE {
322
+ // Don't use this directly. Instead, use parseOptionalForResource
323
+ FOR_RESOURCE {
341
324
@ Override
342
325
void parse (CapturingTokenizer tokenizer ) {
343
326
tokenizer .withState (this , () -> {
344
- IDENTIFIER . parse ( tokenizer );
327
+ tokenizer . next (); // Skip "for"
345
328
SP .parse (tokenizer );
346
329
SHAPE_ID .parse (tokenizer );
347
330
});
@@ -377,11 +360,7 @@ void parse(CapturingTokenizer tokenizer) {
377
360
} else {
378
361
EXPLICIT_SHAPE_MEMBER .parse (tokenizer );
379
362
}
380
-
381
- optionalSpaces (tokenizer );
382
- if (tokenizer .getCurrentToken () == IdlToken .EQUAL ) {
383
- VALUE_ASSIGNMENT .parse (tokenizer );
384
- }
363
+ parseOptionalValueAssignment (tokenizer );
385
364
});
386
365
}
387
366
},
@@ -416,11 +395,9 @@ void parse(CapturingTokenizer tokenizer) {
416
395
void parse (CapturingTokenizer tokenizer ) {
417
396
// Assumes that the shape type is a valid "service" or "resource".
418
397
tokenizer .withState (this , () -> {
419
- parseShapeTypeAndName (tokenizer );
398
+ parseShapeTypeAndName (tokenizer , ENTITY_TYPE_NAME );
420
399
421
- if (tokenizer .isCurrentLexeme ("with" )) {
422
- SHAPE_MIXINS .parse (tokenizer );
423
- }
400
+ parseOptionalMixins (tokenizer );
424
401
425
402
optionalWs (tokenizer );
426
403
tokenizer .expect (IdlToken .LBRACE );
@@ -429,15 +406,21 @@ void parse(CapturingTokenizer tokenizer) {
429
406
}
430
407
},
431
408
409
+ ENTITY_TYPE_NAME {
410
+ @ Override
411
+ void parse (CapturingTokenizer tokenizer ) {
412
+ // Assumes that the current token is a valid entity type name validated by SHAPE.
413
+ tokenizer .withState (this , tokenizer ::next );
414
+ }
415
+ },
416
+
432
417
OPERATION_SHAPE {
433
418
@ Override
434
419
void parse (CapturingTokenizer tokenizer ) {
435
420
tokenizer .withState (this , () -> {
436
421
parseShapeTypeAndName (tokenizer );
437
422
438
- if (tokenizer .isCurrentLexeme ("with" )) {
439
- SHAPE_MIXINS .parse (tokenizer );
440
- }
423
+ parseOptionalMixins (tokenizer );
441
424
442
425
optionalWs (tokenizer );
443
426
OPERATION_BODY .parse (tokenizer );
@@ -486,8 +469,7 @@ void parse(CapturingTokenizer tokenizer) {
486
469
@ Override
487
470
void parse (CapturingTokenizer tokenizer ) {
488
471
tokenizer .withState (this , () -> {
489
- tokenizer .expect (IdlToken .IDENTIFIER );
490
- tokenizer .next (); // skip "input"
472
+ IDENTIFIER .parse (tokenizer ); // skip "input"
491
473
optionalWs (tokenizer );
492
474
operationInputOutputDefinition (tokenizer );
493
475
});
@@ -498,8 +480,7 @@ void parse(CapturingTokenizer tokenizer) {
498
480
@ Override
499
481
void parse (CapturingTokenizer tokenizer ) {
500
482
tokenizer .withState (this , () -> {
501
- tokenizer .expect (IdlToken .IDENTIFIER );
502
- tokenizer .next (); // skip "output"
483
+ IDENTIFIER .parse (tokenizer ); // skip "output"
503
484
optionalWs (tokenizer );
504
485
operationInputOutputDefinition (tokenizer );
505
486
});
@@ -523,8 +504,7 @@ void parse(CapturingTokenizer tokenizer) {
523
504
@ Override
524
505
void parse (CapturingTokenizer tokenizer ) {
525
506
tokenizer .withState (this , () -> {
526
- tokenizer .expect (IdlToken .IDENTIFIER );
527
- tokenizer .next (); // skip "errors"
507
+ IDENTIFIER .parse (tokenizer ); // skip "errors"
528
508
optionalWs (tokenizer );
529
509
tokenizer .expect (IdlToken .COLON );
530
510
tokenizer .next ();
@@ -544,11 +524,12 @@ void parse(CapturingTokenizer tokenizer) {
544
524
545
525
// Mixins =
546
526
// [SP] %s"with" [WS] "[" [WS] 1*(ShapeId [WS]) "]"
547
- SHAPE_MIXINS {
527
+ // Don't use this directly. Instead, use parseOptionalMixins
528
+ MIXINS {
548
529
@ Override
549
530
void parse (CapturingTokenizer tokenizer ) {
550
531
tokenizer .withState (this , () -> {
551
- IDENTIFIER . parse ( tokenizer ); // ' with'
532
+ tokenizer . next ( ); // Skip " with"
552
533
optionalWs (tokenizer );
553
534
554
535
tokenizer .expect (IdlToken .LBRACKET );
@@ -567,6 +548,7 @@ void parse(CapturingTokenizer tokenizer) {
567
548
}
568
549
},
569
550
551
+ // Don't use this directly. Instead, use parseOptionalValueAssignment
570
552
VALUE_ASSIGNMENT {
571
553
@ Override
572
554
void parse (CapturingTokenizer tokenizer ) {
@@ -634,7 +616,9 @@ void parse(CapturingTokenizer tokenizer) {
634
616
case STRING :
635
617
case IDENTIFIER :
636
618
default :
637
- if (tokenizer .peekPastWs ().getIdlToken () == IdlToken .COLON ) {
619
+ CapturedToken nextPastWs = tokenizer .peekWhile (1 , token ->
620
+ token .isWhitespace () || token == IdlToken .DOC_COMMENT );
621
+ if (nextPastWs .getIdlToken () == IdlToken .COLON ) {
638
622
TRAIT_STRUCTURE .parse (tokenizer );
639
623
} else {
640
624
TRAIT_NODE .parse (tokenizer );
@@ -677,7 +661,7 @@ void parse(CapturingTokenizer tokenizer) {
677
661
tokenizer .withState (this , () -> {
678
662
// Try to see if this is a singular or block apply statement.
679
663
IdlToken peek = tokenizer
680
- .peekWhile (1 , t -> t != IdlToken .EOF && t != IdlToken . AT && t != IdlToken .LBRACE )
664
+ .peekWhile (1 , t -> t != IdlToken .AT && t != IdlToken .LBRACE )
681
665
.getIdlToken ();
682
666
if (peek == IdlToken .LBRACE ) {
683
667
APPLY_STATEMENT_BLOCK .parse (tokenizer );
@@ -692,7 +676,7 @@ void parse(CapturingTokenizer tokenizer) {
692
676
@ Override
693
677
void parse (CapturingTokenizer tokenizer ) {
694
678
tokenizer .withState (this , () -> {
695
- tokenizer .next ();
679
+ tokenizer .next (); // Skip "apply"
696
680
SP .parse (tokenizer );
697
681
SHAPE_ID .parse (tokenizer );
698
682
WS .parse (tokenizer );
@@ -705,7 +689,7 @@ void parse(CapturingTokenizer tokenizer) {
705
689
@ Override
706
690
void parse (CapturingTokenizer tokenizer ) {
707
691
tokenizer .withState (this , () -> {
708
- tokenizer .next ();
692
+ tokenizer .next (); // Skip "apply"
709
693
SP .parse (tokenizer );
710
694
SHAPE_ID .parse (tokenizer );
711
695
WS .parse (tokenizer );
@@ -1089,27 +1073,46 @@ protected static void optionalSpaces(CapturingTokenizer tokenizer) {
1089
1073
}
1090
1074
1091
1075
protected static void parseShapeTypeAndName (CapturingTokenizer tokenizer ) {
1092
- tokenizer .expect (IdlToken .IDENTIFIER );
1093
- tokenizer .next (); // skip the shape type
1076
+ parseShapeTypeAndName (tokenizer , null );
1077
+ }
1078
+
1079
+ protected static void parseShapeTypeAndName (CapturingTokenizer tokenizer , TreeType typeName ) {
1080
+ if (typeName == null ) {
1081
+ tokenizer .next ();
1082
+ } else {
1083
+ typeName .parse (tokenizer ); // Skip the shape type
1084
+ }
1094
1085
optionalSpaces (tokenizer );
1095
1086
IDENTIFIER .parse (tokenizer ); // shape name
1096
1087
optionalSpaces (tokenizer );
1097
1088
}
1098
1089
1099
1090
protected static void parseSharedStructureBodyWithinInline (CapturingTokenizer tokenizer ) {
1100
- optionalSpaces (tokenizer );
1091
+ parseOptionalForResource (tokenizer );
1092
+ parseOptionalMixins (tokenizer );
1101
1093
1094
+ optionalWs (tokenizer );
1095
+ SHAPE_MEMBERS .parse (tokenizer );
1096
+ }
1097
+
1098
+ protected static void parseOptionalForResource (CapturingTokenizer tokenizer ) {
1099
+ optionalSpaces (tokenizer );
1102
1100
if (tokenizer .isCurrentLexeme ("for" )) {
1103
- AGGREGATE_SHAPE_RESOURCE .parse (tokenizer );
1104
- optionalSpaces (tokenizer );
1101
+ FOR_RESOURCE .parse (tokenizer );
1105
1102
}
1103
+ }
1106
1104
1105
+ protected static void parseOptionalMixins (CapturingTokenizer tokenizer ) {
1106
+ optionalSpaces (tokenizer );
1107
1107
if (tokenizer .isCurrentLexeme ("with" )) {
1108
- SHAPE_MIXINS .parse (tokenizer );
1108
+ MIXINS .parse (tokenizer );
1109
1109
}
1110
+ }
1110
1111
1111
- optionalWs (tokenizer );
1112
- SHAPE_MEMBERS .parse (tokenizer );
1112
+ protected static void parseOptionalValueAssignment (CapturingTokenizer tokenizer ) {
1113
+ if (tokenizer .peekPastSpaces ().getIdlToken () == IdlToken .EQUAL ) {
1114
+ VALUE_ASSIGNMENT .parse (tokenizer );
1115
+ }
1113
1116
}
1114
1117
1115
1118
protected static void operationInputOutputDefinition (CapturingTokenizer tokenizer ) {
0 commit comments