From 2571797411cfbb383d136cd36009cb8835c149d9 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 23 Jun 2014 20:20:24 +0400 Subject: [PATCH] Don't parse condition if there's no ( for if --- .../lang/parsing/JetExpressionParsing.java | 11 ++--- .../psi/recovery/DoWhileWithEmptyCondition.kt | 7 +++ .../recovery/DoWhileWithEmptyCondition.txt | 43 +++++++++++++++++++ .../psi/recovery/DoWhileWithoutLPar.kt | 7 +++ .../psi/recovery/DoWhileWithoutLPar.txt | 40 +++++++++++++++++ .../psi/recovery/IfWithEmptyCondition.kt | 5 +++ .../psi/recovery/IfWithEmptyCondition.txt | 31 +++++++++++++ .../testData/psi/recovery/IfWithoutLPar.kt | 6 +++ .../testData/psi/recovery/IfWithoutLPar.txt | 36 ++++++++++++++++ .../psi/recovery/WhileWithEmptyCondition.kt | 5 +++ .../psi/recovery/WhileWithEmptyCondition.txt | 28 ++++++++++++ .../testData/psi/recovery/WhileWithoutLPar.kt | 5 +++ .../psi/recovery/WhileWithoutLPar.txt | 33 ++++++++++++++ .../jet/parsing/JetParsingTestGenerated.java | 36 +++++++++++++++- 14 files changed, 286 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/psi/recovery/DoWhileWithEmptyCondition.kt create mode 100644 compiler/testData/psi/recovery/DoWhileWithEmptyCondition.txt create mode 100644 compiler/testData/psi/recovery/DoWhileWithoutLPar.kt create mode 100644 compiler/testData/psi/recovery/DoWhileWithoutLPar.txt create mode 100644 compiler/testData/psi/recovery/IfWithEmptyCondition.kt create mode 100644 compiler/testData/psi/recovery/IfWithEmptyCondition.txt create mode 100644 compiler/testData/psi/recovery/IfWithoutLPar.kt create mode 100644 compiler/testData/psi/recovery/IfWithoutLPar.txt create mode 100644 compiler/testData/psi/recovery/WhileWithEmptyCondition.kt create mode 100644 compiler/testData/psi/recovery/WhileWithEmptyCondition.txt create mode 100644 compiler/testData/psi/recovery/WhileWithoutLPar.kt create mode 100644 compiler/testData/psi/recovery/WhileWithoutLPar.txt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index 9e81e05b271..4cd7dc20ced 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -1548,13 +1548,14 @@ public class JetExpressionParsing extends AbstractJetParsing { */ private void parseCondition() { myBuilder.disableNewlines(); - expect(LPAR, "Expecting a condition in parentheses '(...)'"); - PsiBuilder.Marker condition = mark(); - parseExpression(); - condition.done(CONDITION); + if (expect(LPAR, "Expecting a condition in parentheses '(...)'", EXPRESSION_FIRST)) { + PsiBuilder.Marker condition = mark(); + parseExpression(); + condition.done(CONDITION); + expect(RPAR, "Expecting ')"); + } - expect(RPAR, "Expecting ')"); myBuilder.restoreNewlinesState(); } diff --git a/compiler/testData/psi/recovery/DoWhileWithEmptyCondition.kt b/compiler/testData/psi/recovery/DoWhileWithEmptyCondition.kt new file mode 100644 index 00000000000..b069f62ae2c --- /dev/null +++ b/compiler/testData/psi/recovery/DoWhileWithEmptyCondition.kt @@ -0,0 +1,7 @@ +fun test(): Boolean { + do { + + } while() + + return true +} \ No newline at end of file diff --git a/compiler/testData/psi/recovery/DoWhileWithEmptyCondition.txt b/compiler/testData/psi/recovery/DoWhileWithEmptyCondition.txt new file mode 100644 index 00000000000..93f2df38e04 --- /dev/null +++ b/compiler/testData/psi/recovery/DoWhileWithEmptyCondition.txt @@ -0,0 +1,43 @@ +JetFile: DoWhileWithEmptyCondition.kt + PACKAGE_DIRECTIVE + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('test') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Boolean') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + DO_WHILE + PsiElement(do)('do') + PsiWhiteSpace(' ') + BODY + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace(' ') + PsiElement(while)('while') + PsiElement(LPAR)('(') + CONDITION + PsiErrorElement:Expecting an expression + + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + RETURN + PsiElement(return)('return') + PsiWhiteSpace(' ') + BOOLEAN_CONSTANT + PsiElement(true)('true') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/recovery/DoWhileWithoutLPar.kt b/compiler/testData/psi/recovery/DoWhileWithoutLPar.kt new file mode 100644 index 00000000000..3305b371633 --- /dev/null +++ b/compiler/testData/psi/recovery/DoWhileWithoutLPar.kt @@ -0,0 +1,7 @@ +fun test(): Boolean { + do { + + } while + + return true +} \ No newline at end of file diff --git a/compiler/testData/psi/recovery/DoWhileWithoutLPar.txt b/compiler/testData/psi/recovery/DoWhileWithoutLPar.txt new file mode 100644 index 00000000000..7f9b850ddd0 --- /dev/null +++ b/compiler/testData/psi/recovery/DoWhileWithoutLPar.txt @@ -0,0 +1,40 @@ +JetFile: DoWhileWithoutLPar.kt + PACKAGE_DIRECTIVE + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('test') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Boolean') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + DO_WHILE + PsiElement(do)('do') + PsiWhiteSpace(' ') + BODY + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace(' ') + PsiElement(while)('while') + PsiErrorElement:Expecting a condition in parentheses '(...)' + + PsiWhiteSpace('\n\n ') + RETURN + PsiElement(return)('return') + PsiWhiteSpace(' ') + BOOLEAN_CONSTANT + PsiElement(true)('true') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/recovery/IfWithEmptyCondition.kt b/compiler/testData/psi/recovery/IfWithEmptyCondition.kt new file mode 100644 index 00000000000..31b7744a998 --- /dev/null +++ b/compiler/testData/psi/recovery/IfWithEmptyCondition.kt @@ -0,0 +1,5 @@ +fun test() { + if () + + return true +} \ No newline at end of file diff --git a/compiler/testData/psi/recovery/IfWithEmptyCondition.txt b/compiler/testData/psi/recovery/IfWithEmptyCondition.txt new file mode 100644 index 00000000000..0387edc8c4e --- /dev/null +++ b/compiler/testData/psi/recovery/IfWithEmptyCondition.txt @@ -0,0 +1,31 @@ +JetFile: IfWithEmptyCondition.kt + PACKAGE_DIRECTIVE + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('test') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + IF + PsiElement(if)('if') + PsiWhiteSpace(' ') + PsiElement(LPAR)('(') + CONDITION + PsiErrorElement:Expecting an expression + + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + THEN + RETURN + PsiElement(return)('return') + PsiWhiteSpace(' ') + BOOLEAN_CONSTANT + PsiElement(true)('true') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/recovery/IfWithoutLPar.kt b/compiler/testData/psi/recovery/IfWithoutLPar.kt new file mode 100644 index 00000000000..afeb4d035fd --- /dev/null +++ b/compiler/testData/psi/recovery/IfWithoutLPar.kt @@ -0,0 +1,6 @@ +fun test() { + if + + if (other) { + } +} \ No newline at end of file diff --git a/compiler/testData/psi/recovery/IfWithoutLPar.txt b/compiler/testData/psi/recovery/IfWithoutLPar.txt new file mode 100644 index 00000000000..7b11eff9b59 --- /dev/null +++ b/compiler/testData/psi/recovery/IfWithoutLPar.txt @@ -0,0 +1,36 @@ +JetFile: IfWithoutLPar.kt + PACKAGE_DIRECTIVE + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('test') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + IF + PsiElement(if)('if') + PsiErrorElement:Expecting a condition in parentheses '(...)' + + PsiWhiteSpace('\n\n ') + THEN + IF + PsiElement(if)('if') + PsiWhiteSpace(' ') + PsiElement(LPAR)('(') + CONDITION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('other') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + THEN + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/recovery/WhileWithEmptyCondition.kt b/compiler/testData/psi/recovery/WhileWithEmptyCondition.kt new file mode 100644 index 00000000000..fb0debc6a2a --- /dev/null +++ b/compiler/testData/psi/recovery/WhileWithEmptyCondition.kt @@ -0,0 +1,5 @@ +fun test() { + while () + + return +} \ No newline at end of file diff --git a/compiler/testData/psi/recovery/WhileWithEmptyCondition.txt b/compiler/testData/psi/recovery/WhileWithEmptyCondition.txt new file mode 100644 index 00000000000..5db6abf0700 --- /dev/null +++ b/compiler/testData/psi/recovery/WhileWithEmptyCondition.txt @@ -0,0 +1,28 @@ +JetFile: WhileWithEmptyCondition.kt + PACKAGE_DIRECTIVE + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('test') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + WHILE + PsiElement(while)('while') + PsiWhiteSpace(' ') + PsiElement(LPAR)('(') + CONDITION + PsiErrorElement:Expecting an expression + + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + BODY + RETURN + PsiElement(return)('return') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/recovery/WhileWithoutLPar.kt b/compiler/testData/psi/recovery/WhileWithoutLPar.kt new file mode 100644 index 00000000000..0803ed1226c --- /dev/null +++ b/compiler/testData/psi/recovery/WhileWithoutLPar.kt @@ -0,0 +1,5 @@ +fun test(): Boolean { + while + + return true +} \ No newline at end of file diff --git a/compiler/testData/psi/recovery/WhileWithoutLPar.txt b/compiler/testData/psi/recovery/WhileWithoutLPar.txt new file mode 100644 index 00000000000..64606ef4b66 --- /dev/null +++ b/compiler/testData/psi/recovery/WhileWithoutLPar.txt @@ -0,0 +1,33 @@ +JetFile: WhileWithoutLPar.kt + PACKAGE_DIRECTIVE + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('test') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Boolean') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + WHILE + PsiElement(while)('while') + PsiErrorElement:Expecting a condition in parentheses '(...)' + + PsiWhiteSpace('\n\n ') + BODY + RETURN + PsiElement(return)('return') + PsiWhiteSpace(' ') + BOOLEAN_CONSTANT + PsiElement(true)('true') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java index 5354505a960..72677bc4863 100644 --- a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java @@ -882,19 +882,41 @@ public class JetParsingTestGenerated extends AbstractJetParsingTest { } public void testAllFilesPresentInRecovery() throws Exception { - JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/psi/recovery"), Pattern.compile("^(.*)\\.kts?$"), true); + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", + new File("compiler/testData/psi/recovery"), Pattern.compile("^(.*)\\.kts?$"), + true); + } + + @TestMetadata("DoWhileWithEmptyCondition.kt") + public void testDoWhileWithEmptyCondition() throws Exception { + doParsingTest("compiler/testData/psi/recovery/DoWhileWithEmptyCondition.kt"); + } + + @TestMetadata("DoWhileWithoutLPar.kt") + public void testDoWhileWithoutLPar() throws Exception { + doParsingTest("compiler/testData/psi/recovery/DoWhileWithoutLPar.kt"); } @TestMetadata("EnumEntryInitList.kt") public void testEnumEntryInitList() throws Exception { doParsingTest("compiler/testData/psi/recovery/EnumEntryInitList.kt"); } - + @TestMetadata("ForRecovery.kt") public void testForRecovery() throws Exception { doParsingTest("compiler/testData/psi/recovery/ForRecovery.kt"); } + @TestMetadata("IfWithEmptyCondition.kt") + public void testIfWithEmptyCondition() throws Exception { + doParsingTest("compiler/testData/psi/recovery/IfWithEmptyCondition.kt"); + } + + @TestMetadata("IfWithoutLPar.kt") + public void testIfWithoutLPar() throws Exception { + doParsingTest("compiler/testData/psi/recovery/IfWithoutLPar.kt"); + } + @TestMetadata("ImportRecovery.kt") public void testImportRecovery() throws Exception { doParsingTest("compiler/testData/psi/recovery/ImportRecovery.kt"); @@ -950,6 +972,16 @@ public class JetParsingTestGenerated extends AbstractJetParsingTest { doParsingTest("compiler/testData/psi/recovery/ValueParameterNoTypeRecovery.kt"); } + @TestMetadata("WhileWithEmptyCondition.kt") + public void testWhileWithEmptyCondition() throws Exception { + doParsingTest("compiler/testData/psi/recovery/WhileWithEmptyCondition.kt"); + } + + @TestMetadata("WhileWithoutLPar.kt") + public void testWhileWithoutLPar() throws Exception { + doParsingTest("compiler/testData/psi/recovery/WhileWithoutLPar.kt"); + } + } @TestMetadata("compiler/testData/psi/script")