From ccbb482b08ffa39f830ae876b6e0d455bb6e114d Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 8 Jun 2011 18:49:02 +0400 Subject: [PATCH] Infinite loop in the parser fixed --- .../jet/lang/parsing/JetExpressionParsing.java | 15 ++++++++++----- idea/testData/psi/HangOnLonelyModifier.jet | 3 +++ idea/testData/psi/HangOnLonelyModifier.txt | 17 +++++++++++++++++ idea/testData/psi/When_ERR.txt | 2 +- 4 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 idea/testData/psi/HangOnLonelyModifier.jet create mode 100644 idea/testData/psi/HangOnLonelyModifier.txt diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index 69d6c63cf25..ee7ac511559 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -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(); + } } } diff --git a/idea/testData/psi/HangOnLonelyModifier.jet b/idea/testData/psi/HangOnLonelyModifier.jet new file mode 100644 index 00000000000..9a141db9f8e --- /dev/null +++ b/idea/testData/psi/HangOnLonelyModifier.jet @@ -0,0 +1,3 @@ +fun test() { +in +} diff --git a/idea/testData/psi/HangOnLonelyModifier.txt b/idea/testData/psi/HangOnLonelyModifier.txt new file mode 100644 index 00000000000..954cac7d2e8 --- /dev/null +++ b/idea/testData/psi/HangOnLonelyModifier.txt @@ -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)('}') \ No newline at end of file diff --git a/idea/testData/psi/When_ERR.txt b/idea/testData/psi/When_ERR.txt index 4f00772aab9..2337bebefe9 100644 --- a/idea/testData/psi/When_ERR.txt +++ b/idea/testData/psi/When_ERR.txt @@ -155,7 +155,7 @@ JetFile: When_ERR.jet PsiWhiteSpace(' ') PsiElement(DOUBLE_ARROW)('=>') - PsiErrorElement:Expecting an element + PsiErrorElement:Expecting an expression PsiWhiteSpace(' ') PsiElement(SEMICOLON)(';')