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() {
if (!atSet(EXPRESSION_FIRST)) {
error("Expecting an element");
error("Expecting an expression");
return;
}
parseBinaryExpression(Precedence.ASSIGNMENT);
@@ -952,17 +952,17 @@ public class JetExpressionParsing extends AbstractJetParsing {
* modifiers declarationRest
*/
private boolean parseLocalDeclaration() {
PsiBuilder.Marker decls = mark();
PsiBuilder.Marker decl = mark();
JetParsing.TokenDetector enumDetector = new JetParsing.TokenDetector(ENUM_KEYWORD);
myJetParsing.parseModifierList(MODIFIER_LIST, enumDetector);
JetNodeType declType = parseLocalDeclarationRest(enumDetector.isDetected());
if (declType != null) {
decls.done(declType);
decl.done(declType);
return true;
} else {
decls.rollbackTo();
decl.rollbackTo();
return false;
}
}
@@ -1129,7 +1129,12 @@ public class JetExpressionParsing extends AbstractJetParsing {
*/
private void parseStatement() {
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>
PsiWhiteSpace(' ')
PsiElement(DOUBLE_ARROW)('=>')
PsiErrorElement:Expecting an element
PsiErrorElement:Expecting an expression
<empty list>
PsiWhiteSpace(' ')
PsiElement(SEMICOLON)(';')