Infinite loop in the parser fixed
This commit is contained in:
@@ -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)('}')
|
||||||
@@ -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)(';')
|
||||||
|
|||||||
Reference in New Issue
Block a user