Infinite loop in the parser fixed

This commit is contained in:
Andrey Breslav
2011-06-08 18:49:02 +04:00
parent 9e3453a44e
commit ccbb482b08
4 changed files with 31 additions and 6 deletions
@@ -255,7 +255,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
*/ */
public void parseExpression() { public void parseExpression() {
if (!atSet(EXPRESSION_FIRST)) { if (!atSet(EXPRESSION_FIRST)) {
error("Expecting an element"); error("Expecting an expression");
return; return;
} }
parseBinaryExpression(Precedence.ASSIGNMENT); parseBinaryExpression(Precedence.ASSIGNMENT);
@@ -952,17 +952,17 @@ public class JetExpressionParsing extends AbstractJetParsing {
* modifiers declarationRest * modifiers declarationRest
*/ */
private boolean parseLocalDeclaration() { private boolean parseLocalDeclaration() {
PsiBuilder.Marker decls = mark(); PsiBuilder.Marker decl = mark();
JetParsing.TokenDetector enumDetector = new JetParsing.TokenDetector(ENUM_KEYWORD); JetParsing.TokenDetector enumDetector = new JetParsing.TokenDetector(ENUM_KEYWORD);
myJetParsing.parseModifierList(MODIFIER_LIST, enumDetector); myJetParsing.parseModifierList(MODIFIER_LIST, enumDetector);
JetNodeType declType = parseLocalDeclarationRest(enumDetector.isDetected()); JetNodeType declType = parseLocalDeclarationRest(enumDetector.isDetected());
if (declType != null) { if (declType != null) {
decls.done(declType); decl.done(declType);
return true; return true;
} else { } else {
decls.rollbackTo(); decl.rollbackTo();
return false; return false;
} }
} }
@@ -1129,7 +1129,12 @@ public class JetExpressionParsing extends AbstractJetParsing {
*/ */
private void parseStatement() { private void parseStatement() {
if (!parseLocalDeclaration()) { if (!parseLocalDeclaration()) {
parseExpression(); if (!atSet(EXPRESSION_FIRST)) {
errorAndAdvance("Expecting a statement");
}
else {
parseExpression();
}
} }
} }
@@ -0,0 +1,3 @@
fun test() {
in
}
@@ -0,0 +1,17 @@
JetFile: HangOnLonelyModifier.jet
NAMESPACE
FUN
PsiElement(fun)('fun')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('test')
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
BLOCK
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n')
PsiErrorElement:Expecting a statement
PsiElement(in)('in')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
+1 -1
View File
@@ -155,7 +155,7 @@ JetFile: When_ERR.jet
<empty list> <empty list>
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>') PsiElement(DOUBLE_ARROW)('=>')
PsiErrorElement:Expecting an element PsiErrorElement:Expecting an expression
<empty list> <empty list>
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(SEMICOLON)(';') PsiElement(SEMICOLON)(';')