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 fd0860fbe45d..6b65d3d73d23 100644 --- a/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java +++ b/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java @@ -346,11 +346,11 @@ public class GeneratedParserUtilBase { } } else if (eatMoreFlag) { - errorReported = reportError(builder_, state, true, true); + errorReported = reportError(builder_, state, frame, true, true); parseAsTree(state, builder_, frame.level + 1, DUMMY_BLOCK, true, TOKEN_ADVANCER, eatMore); } else if (eatMoreFlagOnce || (!result && frame.offset != builder_.getCurrentOffset())) { - errorReported = reportError(builder_, state, true, false); + errorReported = reportError(builder_, state, frame, true, false); } if (extensionMarker != null) { extensionMarker.done(extensionTokenType); @@ -361,15 +361,12 @@ public class GeneratedParserUtilBase { state.clearVariants(false, 0); state.lastExpectedVariantOffset = -1; } - if (!result && eatMoreFlagOnce && frame.offset != builder_.getCurrentOffset()) result = true; } else if (!result && pinned && frame.errorReportedAt < 0) { // do not report if there're errors after current offset if (getLastVariantOffset(state, initialOffset) == initialOffset) { // do not force, inner recoverRoot might have skipped some tokens - if (reportError(builder_, state, false, false)) { - frame.errorReportedAt = initialOffset; - } + reportError(builder_, state, frame, false, false); } } // propagate errorReportedAt up the stack to avoid duplicate reporting @@ -392,9 +389,7 @@ public class GeneratedParserUtilBase { } int offset = builder_.getCurrentOffset(); if (frame.errorReportedAt < offset && getLastVariantOffset(state, builder_.getCurrentOffset()) <= offset) { - if (reportError(builder_, state, true, advance)) { - frame.errorReportedAt = offset; - } + reportError(builder_, state, frame, true, advance); } } @@ -402,7 +397,11 @@ public class GeneratedParserUtilBase { return state.lastExpectedVariantOffset < 0? defValue : state.lastExpectedVariantOffset; } - private static boolean reportError(PsiBuilder builder_, ErrorState state, boolean force, boolean advance) { + private static boolean reportError(PsiBuilder builder_, + ErrorState state, + Frame frame, + boolean force, + boolean advance) { String expectedText = state.getExpectedText(builder_); boolean notEmpty = StringUtil.isNotEmpty(expectedText); if (force || notEmpty || advance) { @@ -418,6 +417,7 @@ public class GeneratedParserUtilBase { else { builder_.error(message); } + frame.errorReportedAt = builder_.getCurrentOffset(); return true; } return false;