@@ -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 );
@@ -544,11 +527,12 @@ void parse(CapturingTokenizer tokenizer) {
544
527
545
528
// Mixins =
546
529
// [SP] %s"with" [WS] "[" [WS] 1*(ShapeId [WS]) "]"
547
- SHAPE_MIXINS {
530
+ // Don't use this directly. Instead, use parseOptionalMixins
531
+ MIXINS {
548
532
@ Override
549
533
void parse (CapturingTokenizer tokenizer ) {
550
534
tokenizer .withState (this , () -> {
551
- IDENTIFIER . parse ( tokenizer ); // ' with'
535
+ tokenizer . next ( ); // Skip " with"
552
536
optionalWs (tokenizer );
553
537
554
538
tokenizer .expect (IdlToken .LBRACKET );
@@ -567,6 +551,7 @@ void parse(CapturingTokenizer tokenizer) {
567
551
}
568
552
},
569
553
554
+ // Don't use this directly. Instead, use parseOptionalValueAssignment
570
555
VALUE_ASSIGNMENT {
571
556
@ Override
572
557
void parse (CapturingTokenizer tokenizer ) {
@@ -634,7 +619,9 @@ void parse(CapturingTokenizer tokenizer) {
634
619
case STRING :
635
620
case IDENTIFIER :
636
621
default :
637
- if (tokenizer .peekPastWs ().getIdlToken () == IdlToken .COLON ) {
622
+ CapturedToken nextPastWs = tokenizer .peekWhile (1 , token ->
623
+ token .isWhitespace () || token == IdlToken .DOC_COMMENT );
624
+ if (nextPastWs .getIdlToken () == IdlToken .COLON ) {
638
625
TRAIT_STRUCTURE .parse (tokenizer );
639
626
} else {
640
627
TRAIT_NODE .parse (tokenizer );
@@ -677,7 +664,7 @@ void parse(CapturingTokenizer tokenizer) {
677
664
tokenizer .withState (this , () -> {
678
665
// Try to see if this is a singular or block apply statement.
679
666
IdlToken peek = tokenizer
680
- .peekWhile (1 , t -> t != IdlToken .EOF && t != IdlToken . AT && t != IdlToken .LBRACE )
667
+ .peekWhile (1 , t -> t != IdlToken .AT && t != IdlToken .LBRACE )
681
668
.getIdlToken ();
682
669
if (peek == IdlToken .LBRACE ) {
683
670
APPLY_STATEMENT_BLOCK .parse (tokenizer );
@@ -692,7 +679,7 @@ void parse(CapturingTokenizer tokenizer) {
692
679
@ Override
693
680
void parse (CapturingTokenizer tokenizer ) {
694
681
tokenizer .withState (this , () -> {
695
- tokenizer .next ();
682
+ tokenizer .next (); // Skip "apply"
696
683
SP .parse (tokenizer );
697
684
SHAPE_ID .parse (tokenizer );
698
685
WS .parse (tokenizer );
@@ -705,7 +692,7 @@ void parse(CapturingTokenizer tokenizer) {
705
692
@ Override
706
693
void parse (CapturingTokenizer tokenizer ) {
707
694
tokenizer .withState (this , () -> {
708
- tokenizer .next ();
695
+ tokenizer .next (); // Skip "apply"
709
696
SP .parse (tokenizer );
710
697
SHAPE_ID .parse (tokenizer );
711
698
WS .parse (tokenizer );
@@ -1089,27 +1076,46 @@ protected static void optionalSpaces(CapturingTokenizer tokenizer) {
1089
1076
}
1090
1077
1091
1078
protected static void parseShapeTypeAndName (CapturingTokenizer tokenizer ) {
1092
- tokenizer .expect (IdlToken .IDENTIFIER );
1093
- tokenizer .next (); // skip the shape type
1079
+ parseShapeTypeAndName (tokenizer , null );
1080
+ }
1081
+
1082
+ protected static void parseShapeTypeAndName (CapturingTokenizer tokenizer , TreeType typeName ) {
1083
+ if (typeName == null ) {
1084
+ tokenizer .next ();
1085
+ } else {
1086
+ typeName .parse (tokenizer ); // Skip the shape type
1087
+ }
1094
1088
optionalSpaces (tokenizer );
1095
1089
IDENTIFIER .parse (tokenizer ); // shape name
1096
1090
optionalSpaces (tokenizer );
1097
1091
}
1098
1092
1099
1093
protected static void parseSharedStructureBodyWithinInline (CapturingTokenizer tokenizer ) {
1100
- optionalSpaces (tokenizer );
1094
+ parseOptionalForResource (tokenizer );
1095
+ parseOptionalMixins (tokenizer );
1101
1096
1097
+ optionalWs (tokenizer );
1098
+ SHAPE_MEMBERS .parse (tokenizer );
1099
+ }
1100
+
1101
+ protected static void parseOptionalForResource (CapturingTokenizer tokenizer ) {
1102
+ optionalSpaces (tokenizer );
1102
1103
if (tokenizer .isCurrentLexeme ("for" )) {
1103
- AGGREGATE_SHAPE_RESOURCE .parse (tokenizer );
1104
- optionalSpaces (tokenizer );
1104
+ FOR_RESOURCE .parse (tokenizer );
1105
1105
}
1106
+ }
1106
1107
1108
+ protected static void parseOptionalMixins (CapturingTokenizer tokenizer ) {
1109
+ optionalSpaces (tokenizer );
1107
1110
if (tokenizer .isCurrentLexeme ("with" )) {
1108
- SHAPE_MIXINS .parse (tokenizer );
1111
+ MIXINS .parse (tokenizer );
1109
1112
}
1113
+ }
1110
1114
1111
- optionalWs (tokenizer );
1112
- SHAPE_MEMBERS .parse (tokenizer );
1115
+ protected static void parseOptionalValueAssignment (CapturingTokenizer tokenizer ) {
1116
+ if (tokenizer .peekPastSpaces ().getIdlToken () == IdlToken .EQUAL ) {
1117
+ VALUE_ASSIGNMENT .parse (tokenizer );
1118
+ }
1113
1119
}
1114
1120
1115
1121
protected static void operationInputOutputDefinition (CapturingTokenizer tokenizer ) {
0 commit comments