From 742901a4975d4ea752c96c72b6887be58bdad468 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Thu, 27 Aug 2015 23:20:16 +0300 Subject: [PATCH] GPUB: sync with GK 1.3.x --- .../lang/parser/GeneratedParserUtilBase.java | 111 ++++++++++++------ 1 file changed, 72 insertions(+), 39 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java b/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java index fdb6c56c9da5..097429178772 100644 --- a/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java +++ b/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java @@ -14,8 +14,6 @@ * limitations under the License. */ -// This class is a runtime engine for parsers generated by Grammar-Kit. -// Do not modify or refactor without complete investigation and/or review. package com.intellij.lang.parser; import com.intellij.codeInsight.completion.impl.CamelHumpMatcher; @@ -50,13 +48,21 @@ import java.util.Collection; import java.util.LinkedList; /** + * This class is a runtime engine for parsers generated by Grammar-Kit. + *
+ * Here is the original + * GeneratedParserUtilBase code. + *
+ *
+ * CAUTION: Authorized personnel only. Do not modify or refactor. + * * @author gregsh */ public class GeneratedParserUtilBase { private static final Logger LOG = Logger.getInstance("org.intellij.grammar.parser.GeneratedParserUtilBase"); - private static final int MAX_RECURSION_LEVEL = 1000; + private static final int MAX_RECURSION_LEVEL = StringUtil.parseInt(System.getProperty("grammar.kit.gpub.max.level"), 1000); private static final int MAX_VARIANTS_SIZE = 10000; private static final int MAX_VARIANTS_TO_DISPLAY = 50; @@ -116,7 +122,7 @@ public class GeneratedParserUtilBase { if (!goodMarker) return false; ErrorState state = ErrorState.get(builder); - return !state.frameStack.isEmpty(); + return state.currentFrame != null; } public static TokenSet create_token_set_(IElementType... tokenTypes) { @@ -396,6 +402,7 @@ public class GeneratedParserUtilBase { public static final int _LEFT_INNER_ = 0x4; public static final int _AND_ = 0x8; public static final int _NOT_ = 0x10; + public static final int _UPPER_ = 0x20; // simple enter/exit methods pair that doesn't require frame object public static PsiBuilder.Marker enter_section_(PsiBuilder builder) { @@ -406,20 +413,28 @@ public class GeneratedParserUtilBase { PsiBuilder.Marker marker, @Nullable IElementType elementType, boolean result) { - close_marker_impl_(ErrorState.get(builder).frameStack.peekLast(), marker, elementType, result); + close_marker_impl_(ErrorState.get(builder).currentFrame, marker, elementType, result); } // complex enter/exit methods pair with frame object - public static PsiBuilder.Marker enter_section_(PsiBuilder builder, int level, int modifiers, @Nullable String frameName) { + public static PsiBuilder.Marker enter_section_(PsiBuilder builder, int level, int modifiers, String frameName) { + return enter_section_(builder, level, modifiers, null, frameName); + } + + public static PsiBuilder.Marker enter_section_(PsiBuilder builder, int level, int modifiers) { + return enter_section_(builder, level, modifiers, null, null); + } + + public static PsiBuilder.Marker enter_section_(PsiBuilder builder, int level, int modifiers, IElementType elementType, String frameName) { PsiBuilder.Marker marker = builder.mark(); - enter_section_impl_(builder, level, modifiers, frameName); + enter_section_impl_(builder, level, modifiers, elementType, frameName); return marker; } - private static void enter_section_impl_(PsiBuilder builder, int level, int modifiers, @Nullable String frameName) { + private static void enter_section_impl_(PsiBuilder builder, int level, int modifiers, IElementType elementType, String frameName) { ErrorState state = ErrorState.get(builder); - Frame frame = state.FRAMES.alloc().init(builder, state, level, modifiers, frameName); - Frame prevFrame = state.frameStack.peekLast(); + Frame frame = state.FRAMES.alloc().init(builder, state, level, modifiers, elementType, frameName); + Frame prevFrame = state.currentFrame; if (prevFrame != null && prevFrame.errorReportedAt > frame.position) { // report error for previous unsuccessful frame reportError(builder, state, frame, null, true, false); @@ -430,7 +445,7 @@ public class GeneratedParserUtilBase { frame.leftMarker = left; } } - state.frameStack.add(frame); + state.currentFrame = frame; if ((modifiers & _AND_) != 0) { if (state.predicateCount == 0 && !state.predicateSign) { throw new AssertionError("Incorrect false predicate sign"); @@ -448,6 +463,15 @@ public class GeneratedParserUtilBase { } } + public static void exit_section_(PsiBuilder builder, + int level, + PsiBuilder.Marker marker, + boolean result, + boolean pinned, + @Nullable Parser eatMore) { + exit_section_(builder, level, marker, null, result, pinned, eatMore); + } + public static void exit_section_(PsiBuilder builder, int level, PsiBuilder.Marker marker, @@ -457,7 +481,9 @@ public class GeneratedParserUtilBase { @Nullable Parser eatMore) { ErrorState state = ErrorState.get(builder); - Frame frame = state.frameStack.pollLast(); + Frame frame = state.currentFrame; + state.currentFrame = frame == null ? null : frame.parentFrame; + if (frame != null && frame.elementType != null) elementType = frame.elementType; if (frame == null || level != frame.level) { LOG.error("Unbalanced error section: got " + frame + ", expected level " + level); if (frame != null) state.FRAMES.recycle(frame); @@ -469,11 +495,11 @@ public class GeneratedParserUtilBase { close_marker_impl_(frame, marker, null, false); state.predicateCount--; if ((frame.modifiers & _NOT_) != 0) state.predicateSign = !state.predicateSign; - state.FRAMES.recycle(frame); - return; } - close_frame_impl_(state, frame, builder, marker, elementType, result, pinned); - exit_section_impl_(state, frame, builder, elementType, result, pinned, eatMore); + else { + close_frame_impl_(state, frame, builder, marker, elementType, result, pinned); + exit_section_impl_(state, frame, builder, elementType, result, pinned, eatMore); + } state.FRAMES.recycle(frame); } @@ -560,7 +586,7 @@ public class GeneratedParserUtilBase { } } // propagate errorReportedAt up the stack to avoid duplicate reporting - Frame prevFrame = willFail && eatMore == null ? null : state.frameStack.peekLast(); + Frame prevFrame = willFail && eatMore == null ? null : state.currentFrame; if (prevFrame != null && prevFrame.errorReportedAt < frame.errorReportedAt) { prevFrame.errorReportedAt = frame.errorReportedAt; } @@ -585,7 +611,11 @@ public class GeneratedParserUtilBase { } } if (result || pinned) { - if ((frame.modifiers & _LEFT_INNER_) != 0 && frame.leftMarker != null) { + if ((frame.modifiers & _UPPER_) != 0) { + marker.drop(); + frame.parentFrame.elementType = elementType; + } + else if ((frame.modifiers & _LEFT_INNER_) != 0 && frame.leftMarker != null) { marker.done(elementType); frame.leftMarker.precede().done(((LighterASTNode)frame.leftMarker).getTokenType()); frame.leftMarker.drop(); @@ -628,8 +658,8 @@ public class GeneratedParserUtilBase { else { if (frame != null) { int position = ((PsiBuilderImpl.ProductionMarker)marker).getStartIndex(); - if (frame.errorReportedAt > position) { - frame.errorReportedAt = frame.errorReportedAtPrev; + if (frame.errorReportedAt > position && frame.parentFrame != null) { + frame.errorReportedAt = frame.parentFrame.errorReportedAt; } } marker.rollbackTo(); @@ -642,7 +672,7 @@ public class GeneratedParserUtilBase { } public static void report_error_(PsiBuilder builder, ErrorState state, boolean advance) { - Frame frame = state.frameStack.isEmpty()? null : state.frameStack.getLast(); + Frame frame = state.currentFrame; if (frame == null) { LOG.error("unbalanced enter/exit section call: got null"); return; @@ -765,7 +795,7 @@ public class GeneratedParserUtilBase { int predicateCount; boolean predicateSign = true; boolean suppressErrors; - public final LinkedList frameStack = new LinkedList(); + public Frame currentFrame; public CompletionState completionState; private boolean caseSensitive; @@ -784,7 +814,7 @@ public class GeneratedParserUtilBase { } @Override - public void cleanup(@NotNull final Variant o) { + public void cleanup(@NotNull Variant o) { } }); final LimitedPool FRAMES = new LimitedPool(FRAMES_POOL_SIZE, new LimitedPool.ObjectFactory() { @@ -795,7 +825,7 @@ public class GeneratedParserUtilBase { } @Override - public void cleanup(@NotNull final Frame o) { + public void cleanup(@NotNull Frame o) { } }); @@ -865,23 +895,17 @@ public class GeneratedParserUtilBase { return count > 0; } - public int getVariantsSize() { - return variants.size(); + public void clearVariants(Frame frame) { + clearVariants(true, frame == null ? 0 : frame.variantCount); } - public void clearVariants(boolean expected, int start) { + void clearVariants(boolean expected, int start) { MyList list = expected? variants : unexpected; if (start < 0 || start >= list.size()) return; for (int i = start, len = list.size(); i < len; i ++) { VARIANTS.recycle(list.get(i)); } list.setSize(start); - if (expected) { - lastExpectedVariantPos = -1; - for (Variant variant : list) { - if (lastExpectedVariantPos < variant.position) lastExpectedVariantPos = variant.position; - } - } } public boolean typeExtends(IElementType child, IElementType parent) { @@ -896,6 +920,9 @@ public class GeneratedParserUtilBase { } public static class Frame { + public Frame parentFrame; + public IElementType elementType; + public int offset; public int position; public int level; @@ -903,13 +930,20 @@ public class GeneratedParserUtilBase { public String name; public int variantCount; public int errorReportedAt; - public int errorReportedAtPrev; public PsiBuilder.Marker leftMarker; public Frame() { } - public Frame init(PsiBuilder builder, ErrorState state, int level_, int modifiers_, String name_) { + public Frame init(PsiBuilder builder, + ErrorState state, + int level_, + int modifiers_, + IElementType elementType_, + String name_) { + parentFrame = state.currentFrame; + elementType = elementType_; + offset = builder.getCurrentOffset(); position = builder.rawTokenIndex(); level = level_; @@ -918,8 +952,6 @@ public class GeneratedParserUtilBase { variantCount = state.variants.size(); errorReportedAt = -1; - Frame prev = state.frameStack.peekLast(); - errorReportedAtPrev = prev == null? -1 : prev.errorReportedAt; leftMarker = null; return this; } @@ -931,8 +963,9 @@ public class GeneratedParserUtilBase { ((modifiers & _LEFT_) != 0? "_LEFT_, ": "") + ((modifiers & _LEFT_INNER_) != 0? "_LEFT_INNER_, ": "") + ((modifiers & _AND_) != 0? "_AND_, ": "") + - ((modifiers & _NOT_) != 0? "_NOT_, ": ""); - return String.format("{%s:%s:%d, %d, %s%s}", offset, position, level, errorReportedAt, mod, name); + ((modifiers & _NOT_) != 0? "_NOT_, ": "") + + ((modifiers & _UPPER_) != 0 ? "_UPPER_, " : ""); + return String.format("{%s:%s:%d, %d, %s%s, %s}", offset, position, level, errorReportedAt, mod, elementType, name); } }