@@ -113,7 +113,7 @@ public static boolean invalid_left_marker_guard_(PsiBuilder builder, PsiBuilder.
113
113
if (!goodMarker ) return false ;
114
114
ErrorState state = ErrorState .get (builder );
115
115
116
- return ! state .frameStack . isEmpty () ;
116
+ return state .currentFrame != null ;
117
117
}
118
118
119
119
public static TokenSet create_token_set_ (IElementType ... tokenTypes ) {
@@ -393,6 +393,7 @@ public static boolean isWhitespaceOrComment(@NotNull PsiBuilder builder, @Nullab
393
393
public static final int _LEFT_INNER_ = 0x4 ;
394
394
public static final int _AND_ = 0x8 ;
395
395
public static final int _NOT_ = 0x10 ;
396
+ public static final int _UPPER_ = 0x20 ;
396
397
397
398
// simple enter/exit methods pair that doesn't require frame object
398
399
public static PsiBuilder .Marker enter_section_ (PsiBuilder builder ) {
@@ -403,7 +404,7 @@ public static void exit_section_(PsiBuilder builder,
403
404
PsiBuilder .Marker marker ,
404
405
@ Nullable IElementType elementType ,
405
406
boolean result ) {
406
- close_marker_impl_ (ErrorState .get (builder ).frameStack . peekLast () , marker , elementType , result );
407
+ close_marker_impl_ (ErrorState .get (builder ).currentFrame , marker , elementType , result );
407
408
}
408
409
409
410
// complex enter/exit methods pair with frame object
@@ -416,7 +417,7 @@ public static PsiBuilder.Marker enter_section_(PsiBuilder builder, int level, in
416
417
private static void enter_section_impl_ (PsiBuilder builder , int level , int modifiers , @ Nullable String frameName ) {
417
418
ErrorState state = ErrorState .get (builder );
418
419
Frame frame = state .FRAMES .alloc ().init (builder , state , level , modifiers , frameName );
419
- Frame prevFrame = state .frameStack . peekLast () ;
420
+ Frame prevFrame = state .currentFrame ;
420
421
if (prevFrame != null && prevFrame .errorReportedAt > frame .position ) {
421
422
// report error for previous unsuccessful frame
422
423
reportError (builder , state , frame , null , true , false );
@@ -427,7 +428,7 @@ private static void enter_section_impl_(PsiBuilder builder, int level, int modif
427
428
frame .leftMarker = left ;
428
429
}
429
430
}
430
- state .frameStack . add ( frame ) ;
431
+ state .currentFrame = frame ;
431
432
if ((modifiers & _AND_ ) != 0 ) {
432
433
if (state .predicateCount == 0 && !state .predicateSign ) {
433
434
throw new AssertionError ("Incorrect false predicate sign" );
@@ -454,7 +455,9 @@ public static void exit_section_(PsiBuilder builder,
454
455
@ Nullable Parser eatMore ) {
455
456
ErrorState state = ErrorState .get (builder );
456
457
457
- Frame frame = state .frameStack .pollLast ();
458
+ Frame frame = state .currentFrame ;
459
+ state .currentFrame = frame == null ? null : frame .parentFrame ;
460
+ if (frame != null && frame .branchType != null ) elementType = frame .branchType ;
458
461
if (frame == null || level != frame .level ) {
459
462
LOG .error ("Unbalanced error section: got " + frame + ", expected level " + level );
460
463
if (frame != null ) state .FRAMES .recycle (frame );
@@ -466,11 +469,11 @@ public static void exit_section_(PsiBuilder builder,
466
469
close_marker_impl_ (frame , marker , null , false );
467
470
state .predicateCount --;
468
471
if ((frame .modifiers & _NOT_ ) != 0 ) state .predicateSign = !state .predicateSign ;
469
- state .FRAMES .recycle (frame );
470
- return ;
471
472
}
472
- close_frame_impl_ (state , frame , builder , marker , elementType , result , pinned );
473
- exit_section_impl_ (state , frame , builder , elementType , result , pinned , eatMore );
473
+ else {
474
+ close_frame_impl_ (state , frame , builder , marker , elementType , result , pinned );
475
+ exit_section_impl_ (state , frame , builder , elementType , result , pinned , eatMore );
476
+ }
474
477
state .FRAMES .recycle (frame );
475
478
}
476
479
@@ -554,7 +557,7 @@ else if (lastErrorPos > initialPos) {
554
557
}
555
558
}
556
559
// propagate errorReportedAt up the stack to avoid duplicate reporting
557
- Frame prevFrame = willFail && eatMore == null ? null : state .frameStack . peekLast () ;
560
+ Frame prevFrame = willFail && eatMore == null ? null : state .currentFrame ;
558
561
if (prevFrame != null && prevFrame .errorReportedAt < frame .errorReportedAt ) {
559
562
prevFrame .errorReportedAt = frame .errorReportedAt ;
560
563
}
@@ -579,7 +582,11 @@ private static void close_frame_impl_(ErrorState state,
579
582
}
580
583
}
581
584
if (result || pinned ) {
582
- if ((frame .modifiers & _LEFT_INNER_ ) != 0 && frame .leftMarker != null ) {
585
+ if ((frame .modifiers & _UPPER_ ) != 0 ) {
586
+ marker .drop ();
587
+ frame .parentFrame .branchType = elementType ;
588
+ }
589
+ else if ((frame .modifiers & _LEFT_INNER_ ) != 0 && frame .leftMarker != null ) {
583
590
marker .done (elementType );
584
591
frame .leftMarker .precede ().done (((LighterASTNode )frame .leftMarker ).getTokenType ());
585
592
frame .leftMarker .drop ();
@@ -622,8 +629,8 @@ private static void close_marker_impl_(Frame frame, PsiBuilder.Marker marker, IE
622
629
else {
623
630
if (frame != null ) {
624
631
int position = ((PsiBuilderImpl .ProductionMarker )marker ).getStartIndex ();
625
- if (frame .errorReportedAt > position ) {
626
- frame .errorReportedAt = frame .errorReportedAtPrev ;
632
+ if (frame .errorReportedAt > position && frame . parentFrame != null ) {
633
+ frame .errorReportedAt = frame .parentFrame . errorReportedAt ;
627
634
}
628
635
}
629
636
marker .rollbackTo ();
@@ -636,7 +643,7 @@ public static boolean report_error_(PsiBuilder builder, boolean result) {
636
643
}
637
644
638
645
public static void report_error_ (PsiBuilder builder , ErrorState state , boolean advance ) {
639
- Frame frame = state .frameStack . isEmpty ()? null : state . frameStack . getLast () ;
646
+ Frame frame = state .currentFrame ;
640
647
if (frame == null ) {
641
648
LOG .error ("unbalanced enter/exit section call: got null" );
642
649
return ;
@@ -755,7 +762,7 @@ public static class ErrorState {
755
762
int predicateCount ;
756
763
boolean predicateSign = true ;
757
764
boolean suppressErrors ;
758
- public final LinkedList < Frame > frameStack = new LinkedList < Frame >() ;
765
+ public Frame currentFrame ;
759
766
public CompletionState completionState ;
760
767
761
768
private boolean caseSensitive ;
@@ -876,20 +883,22 @@ boolean typeExtends(IElementType child, IElementType parent) {
876
883
}
877
884
878
885
public static class Frame {
886
+ public Frame parentFrame ;
879
887
public int offset ;
880
888
public int position ;
881
889
public int level ;
882
890
public int modifiers ;
883
891
public String name ;
884
892
public int variantCount ;
885
893
public int errorReportedAt ;
886
- public int errorReportedAtPrev ;
887
894
public PsiBuilder .Marker leftMarker ;
895
+ public IElementType branchType ;
888
896
889
897
public Frame () {
890
898
}
891
899
892
900
public Frame init (PsiBuilder builder , ErrorState state , int level_ , int modifiers_ , String name_ ) {
901
+ parentFrame = state .currentFrame ;
893
902
offset = builder .getCurrentOffset ();
894
903
position = builder .rawTokenIndex ();
895
904
level = level_ ;
@@ -898,9 +907,8 @@ public Frame init(PsiBuilder builder, ErrorState state, int level_, int modifier
898
907
variantCount = state .variants .size ();
899
908
errorReportedAt = -1 ;
900
909
901
- Frame prev = state .frameStack .peekLast ();
902
- errorReportedAtPrev = prev == null ? -1 : prev .errorReportedAt ;
903
910
leftMarker = null ;
911
+ branchType = null ;
904
912
return this ;
905
913
}
906
914
@@ -911,7 +919,8 @@ public String toString() {
911
919
((modifiers & _LEFT_ ) != 0 ? "_LEFT_, " : "" ) +
912
920
((modifiers & _LEFT_INNER_ ) != 0 ? "_LEFT_INNER_, " : "" ) +
913
921
((modifiers & _AND_ ) != 0 ? "_AND_, " : "" ) +
914
- ((modifiers & _NOT_ ) != 0 ? "_NOT_, " : "" );
922
+ ((modifiers & _NOT_ ) != 0 ? "_NOT_, " : "" ) +
923
+ ((modifiers & _UPPER_ ) != 0 ? "_UPPER_, " : "" );
915
924
return String .format ("{%s:%s:%d, %d, %s%s}" , offset , position , level , errorReportedAt , mod , name );
916
925
}
917
926
}
0 commit comments