GPUB: never alter result flag

This commit is contained in:
Gregory.Shrago
2013-02-12 22:15:17 +04:00
parent 0e830fdf1e
commit cd7dff25f5
@@ -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;