From a37c3ba200a4c5a412637b41732c935268f14ca8 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 15 Oct 2010 13:25:42 +0400 Subject: [PATCH] New Java parser: fix for incomplete for-each statement --- .../lang/java/parser/StatementParser.java | 2 +- .../commonParsing/IncompleteFor.java | 12 ++ .../commonParsing/IncompleteFor.txt | 103 ++++++++++++++++++ .../statements/ForEachIncomplete0.txt | 22 ++++ .../java/parser/CommonJavaParsingTest.java | 3 +- .../parser/partial/StatementParserTest.java | 1 + 6 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/psi/parser-full/commonParsing/IncompleteFor.java create mode 100644 java/java-tests/testData/psi/parser-full/commonParsing/IncompleteFor.txt create mode 100644 java/java-tests/testData/psi/parser-partial/statements/ForEachIncomplete0.txt diff --git a/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java b/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java index 468707c393b8..249e00ec6515 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/StatementParser.java @@ -372,7 +372,7 @@ public class StatementParser { final PsiBuilder.Marker afterParenth = builder.mark(); final PsiBuilder.Marker param = DeclarationParser.parseParameter(builder, false); - if (param == null || builder.getTokenType() != JavaTokenType.COLON) { + if (param == null || JavaParserUtil.exprType(param) != JavaElementType.PARAMETER || builder.getTokenType() != JavaTokenType.COLON) { afterParenth.rollbackTo(); return parseForLoopFromInitialization(builder, statement); } diff --git a/java/java-tests/testData/psi/parser-full/commonParsing/IncompleteFor.java b/java/java-tests/testData/psi/parser-full/commonParsing/IncompleteFor.java new file mode 100644 index 000000000000..4a48d1e71b4b --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/commonParsing/IncompleteFor.java @@ -0,0 +1,12 @@ +import java.util.*; + +class BarGoo {} + +class Foo { + { + List goos; + for (BarGoo : goos) { + +} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/commonParsing/IncompleteFor.txt b/java/java-tests/testData/psi/parser-full/commonParsing/IncompleteFor.txt new file mode 100644 index 000000000000..c25b3709ae6b --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/commonParsing/IncompleteFor.txt @@ -0,0 +1,103 @@ +PsiJavaFile:IncompleteFor.java + PsiImportList + PsiImportStatement + PsiKeyword:import('import') + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:java.util + PsiJavaCodeReferenceElement:java + PsiIdentifier:java('java') + PsiReferenceParameterList + + PsiJavaToken:DOT('.') + PsiIdentifier:util('util') + PsiReferenceParameterList + + PsiJavaToken:DOT('.') + PsiJavaToken:ASTERISK('*') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n\n') + PsiClass:BarGoo + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:BarGoo('BarGoo') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n\n') + PsiClass:Foo + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:Foo('Foo') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiClassInitializer + PsiModifierList: + + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiDeclarationStatement + PsiLocalVariable:goos + PsiModifierList: + + PsiTypeElement:List + PsiJavaCodeReferenceElement:List + PsiIdentifier:List('List') + PsiReferenceParameterList + PsiJavaToken:LT('<') + PsiTypeElement:BarGoo + PsiJavaCodeReferenceElement:BarGoo + PsiIdentifier:BarGoo('BarGoo') + PsiReferenceParameterList + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiIdentifier:goos('goos') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiForStatement + PsiKeyword:for('for') + PsiWhiteSpace(' ') + PsiJavaToken:LPARENTH('(') + PsiLabeledStatement + PsiIdentifier:BarGoo('BarGoo') + PsiWhiteSpace(' ') + PsiJavaToken:COLON(':') + PsiWhiteSpace(' ') + PsiExpressionStatement + PsiReferenceExpression:goos + PsiReferenceParameterList + + PsiIdentifier:goos('goos') + PsiErrorElement:';' expected + + PsiErrorElement:';' expected + + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiBlockStatement + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n\n') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/ForEachIncomplete0.txt b/java/java-tests/testData/psi/parser-partial/statements/ForEachIncomplete0.txt new file mode 100644 index 000000000000..d91ecaf881d1 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/ForEachIncomplete0.txt @@ -0,0 +1,22 @@ +PsiJavaFile:ForEachIncomplete0.java + PsiForStatement + PsiKeyword:for('for') + PsiJavaToken:LPARENTH('(') + PsiLabeledStatement + PsiIdentifier:Object('Object') + PsiWhiteSpace(' ') + PsiJavaToken:COLON(':') + PsiWhiteSpace(' ') + PsiExpressionStatement + PsiReferenceExpression:list + PsiReferenceParameterList + + PsiIdentifier:list('list') + PsiErrorElement:';' expected + + PsiErrorElement:';' expected + + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiEmptyStatement + PsiJavaToken:SEMICOLON(';') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/CommonJavaParsingTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/CommonJavaParsingTest.java index df2c23887983..3804699f39f4 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/CommonJavaParsingTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/CommonJavaParsingTest.java @@ -24,5 +24,6 @@ public class CommonJavaParsingTest extends JavaParsingTestCase{ public void testIncompleteCodeBlock() { doTest(true); } public void testImportListBug() { doTest(true); } public void testRefParamsAfterError() { doTest(true); } - public void testUnclosedComment() { doTest(true); } // todo: fix + public void testUnclosedComment() { doTest(true); } + public void testIncompleteFor() { doTest(true); } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/StatementParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/StatementParserTest.java index d4b2df757428..48bb7b8ce083 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/StatementParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/StatementParserTest.java @@ -70,6 +70,7 @@ public class StatementParserTest extends JavaParsingTestCase { public void testForIncomplete7() { doParserTest("for() foo();"); } public void testForIncomplete8() { doParserTest("for(int i = 0;) foo();"); } public void testForIncomplete9() { doParserTest("for(int i = 0; i < 0) foo();"); } + public void testForEachIncomplete0() { doParserTest("for(Object : list) ;"); } public void testIfNormalWithElse() { doParserTest("if (a){ f1(); } else{ f2(); }"); } public void testIfNormalNoElse() { doParserTest("if (a) f1();"); }