diff --git a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index eb0c01af1bac..698ae3e21fd6 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -514,13 +514,14 @@ public class DeclarationParser { if (expect(builder, JavaTokenType.IDENTIFIER)) { eatBrackets(builder); + param.done(JavaElementType.PARAMETER); + return param; } else { error(builder, JavaErrorMessages.message("expected.identifier")); + param.drop(); + return type; } - - param.done(JavaElementType.PARAMETER); - return param; } @Nullable 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 1abd6483f2ef..d9b1b0bb6d08 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 @@ -22,6 +22,7 @@ import com.intellij.psi.impl.source.tree.ElementType; import com.intellij.psi.impl.source.tree.JavaElementType; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.ILazyParseableElementType; +import com.intellij.psi.tree.TokenSet; import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -39,6 +40,8 @@ public class StatementParser { TILL_FIRST, TILL_LAST } + private static final TokenSet TRY_CLOSERS_SET = TokenSet.create(JavaTokenType.CATCH_KEYWORD, JavaTokenType.FINALLY_KEYWORD); + private StatementParser() { } @Nullable @@ -506,20 +509,103 @@ public class StatementParser { @NotNull private static PsiBuilder.Marker parseThrowStatement(final PsiBuilder builder) { - // todo: implement - throw new UnsupportedOperationException(builder.toString()); + final PsiBuilder.Marker statement = builder.mark(); + builder.advanceLexer(); + + final PsiBuilder.Marker expr = ExpressionParser.parse(builder); + if (expr == null) { + error(builder, JavaErrorMessages.message("expected.expression")); + statement.done(JavaElementType.THROW_STATEMENT); + return statement; + } + + semicolon(builder); + statement.done(JavaElementType.THROW_STATEMENT); + return statement; } @NotNull private static PsiBuilder.Marker parseSynchronizedStatement(final PsiBuilder builder) { - // todo: implement - throw new UnsupportedOperationException(builder.toString()); + final PsiBuilder.Marker statement = builder.mark(); + builder.advanceLexer(); + + if (!parseExpressionInParenth(builder)) { + statement.done(JavaElementType.SYNCHRONIZED_STATEMENT); + return statement; + } + + final PsiBuilder.Marker body = parseCodeBlock(builder); + if (body == null) { + error(builder, JavaErrorMessages.message("expected.lbrace")); + } + + statement.done(JavaElementType.SYNCHRONIZED_STATEMENT); + return statement; } @NotNull private static PsiBuilder.Marker parseTryStatement(final PsiBuilder builder) { - // todo: implement - throw new UnsupportedOperationException(builder.toString()); + final PsiBuilder.Marker statement = builder.mark(); + builder.advanceLexer(); + + final PsiBuilder.Marker tryBlock = parseCodeBlock(builder); + if (tryBlock == null) { + error(builder, JavaErrorMessages.message("expected.lbrace")); + statement.done(JavaElementType.TRY_STATEMENT); + return statement; + } + + if (!TRY_CLOSERS_SET.contains(builder.getTokenType())) { + error(builder, JavaErrorMessages.message("expected.catch.or.finally")); + statement.done(JavaElementType.TRY_STATEMENT); + return statement; + } + + while (builder.getTokenType() == JavaTokenType.CATCH_KEYWORD) { + if (!parseCatchBlock(builder)) break; + } + + if (expect(builder, JavaTokenType.FINALLY_KEYWORD)) { + final PsiBuilder.Marker finallyBlock = parseCodeBlock(builder); + if (finallyBlock == null) { + error(builder, JavaErrorMessages.message("expected.lbrace")); + } + } + + statement.done(JavaElementType.TRY_STATEMENT); + return statement; + } + + private static boolean parseCatchBlock(final PsiBuilder builder) { + final PsiBuilder.Marker section = builder.mark(); + builder.advanceLexer(); + + if (!expect(builder, JavaTokenType.LPARENTH)) { + error(builder, JavaErrorMessages.message("expected.lparen")); + section.done(JavaElementType.CATCH_SECTION); + return false; + } + + final PsiBuilder.Marker param = DeclarationParser.parseParameter(builder, false); + if (param == null) { + error(builder, JavaErrorMessages.message("expected.parameter")); + } + + if (!expect(builder, JavaTokenType.RPARENTH)) { + error(builder, JavaErrorMessages.message("expected.rparen")); + section.done(JavaElementType.CATCH_SECTION); + return false; + } + + final PsiBuilder.Marker body = parseCodeBlock(builder); + if (body == null) { + error(builder, JavaErrorMessages.message("expected.lbrace")); + section.done(JavaElementType.CATCH_SECTION); + return false; + } + + section.done(JavaElementType.CATCH_SECTION); + return true; } @NotNull diff --git a/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete0.txt b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete0.txt new file mode 100644 index 000000000000..38d2c313305d --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete0.txt @@ -0,0 +1,10 @@ +PsiJavaFile:SyncIncomplete0.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiSynchronizedStatement + PsiKeyword:synchronized('synchronized') + PsiErrorElement:'(' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete1.txt b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete1.txt new file mode 100644 index 000000000000..d3e449fcd310 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete1.txt @@ -0,0 +1,11 @@ +PsiJavaFile:SyncIncomplete1.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiSynchronizedStatement + PsiKeyword:synchronized('synchronized') + PsiJavaToken:LPARENTH('(') + PsiErrorElement:Expression expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete2.txt b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete2.txt new file mode 100644 index 000000000000..528cbe4fd35d --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete2.txt @@ -0,0 +1,15 @@ +PsiJavaFile:SyncIncomplete2.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiSynchronizedStatement + PsiKeyword:synchronized('synchronized') + PsiJavaToken:LPARENTH('(') + PsiReferenceExpression:o + PsiReferenceParameterList + + PsiIdentifier:o('o') + PsiErrorElement:')' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete3.txt b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete3.txt new file mode 100644 index 000000000000..ad8f3af396b9 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete3.txt @@ -0,0 +1,16 @@ +PsiJavaFile:SyncIncomplete3.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiSynchronizedStatement + PsiKeyword:synchronized('synchronized') + PsiJavaToken:LPARENTH('(') + PsiReferenceExpression:o + PsiReferenceParameterList + + PsiIdentifier:o('o') + PsiJavaToken:RPARENTH(')') + PsiErrorElement:'{' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete4.txt b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete4.txt new file mode 100644 index 000000000000..6b2fb30de3b8 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete4.txt @@ -0,0 +1,15 @@ +PsiJavaFile:SyncIncomplete4.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiSynchronizedStatement + PsiKeyword:synchronized('synchronized') + PsiJavaToken:LPARENTH('(') + PsiErrorElement:Expression expected + + PsiJavaToken:RPARENTH(')') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete5.txt b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete5.txt new file mode 100644 index 000000000000..442a25228d41 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/SyncIncomplete5.txt @@ -0,0 +1,22 @@ +PsiJavaFile:SyncIncomplete5.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiSynchronizedStatement + PsiKeyword:synchronized('synchronized') + PsiJavaToken:LPARENTH('(') + PsiErrorElement:Expression expected + + PsiWhiteSpace('\n ') + PsiExpressionStatement + PsiMethodCallExpression:foo() + PsiReferenceExpression:foo + PsiReferenceParameterList + + PsiIdentifier:foo('foo') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/SyncNormal.txt b/java/java-tests/testData/psi/parser-partial/statements/SyncNormal.txt new file mode 100644 index 000000000000..2d2d42976e98 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/SyncNormal.txt @@ -0,0 +1,17 @@ +PsiJavaFile:SyncNormal.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiSynchronizedStatement + PsiKeyword:synchronized('synchronized') + PsiJavaToken:LPARENTH('(') + PsiReferenceExpression:o + PsiReferenceParameterList + + PsiIdentifier:o('o') + PsiJavaToken:RPARENTH(')') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/ThrowIncomplete0.txt b/java/java-tests/testData/psi/parser-partial/statements/ThrowIncomplete0.txt new file mode 100644 index 000000000000..9466d2cb5835 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/ThrowIncomplete0.txt @@ -0,0 +1,10 @@ +PsiJavaFile:ThrowIncomplete0.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiThrowStatement + PsiKeyword:throw('throw') + PsiErrorElement:Expression expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/ThrowIncomplete1.txt b/java/java-tests/testData/psi/parser-partial/statements/ThrowIncomplete1.txt new file mode 100644 index 000000000000..84fabd5a24d2 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/ThrowIncomplete1.txt @@ -0,0 +1,15 @@ +PsiJavaFile:ThrowIncomplete1.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiThrowStatement + PsiKeyword:throw('throw') + PsiWhiteSpace(' ') + PsiReferenceExpression:e + PsiReferenceParameterList + + PsiIdentifier:e('e') + PsiErrorElement:';' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/ThrowNormal.txt b/java/java-tests/testData/psi/parser-partial/statements/ThrowNormal.txt new file mode 100644 index 000000000000..970f7e335ecf --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/ThrowNormal.txt @@ -0,0 +1,14 @@ +PsiJavaFile:ThrowNormal.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiThrowStatement + PsiKeyword:throw('throw') + PsiWhiteSpace(' ') + PsiReferenceExpression:e + PsiReferenceParameterList + + PsiIdentifier:e('e') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete0.txt b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete0.txt new file mode 100644 index 000000000000..26280a174633 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete0.txt @@ -0,0 +1,10 @@ +PsiJavaFile:TryIncomplete0.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiErrorElement:'{' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete1.txt b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete1.txt new file mode 100644 index 000000000000..52577f536cb1 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete1.txt @@ -0,0 +1,13 @@ +PsiJavaFile:TryIncomplete1.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiErrorElement:'catch' or 'finally' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete2.txt b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete2.txt new file mode 100644 index 000000000000..5c4abc6d4083 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete2.txt @@ -0,0 +1,15 @@ +PsiJavaFile:TryIncomplete2.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiCatchSection + PsiKeyword:catch('catch') + PsiErrorElement:'(' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete3.txt b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete3.txt new file mode 100644 index 000000000000..ffb30d602c45 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete3.txt @@ -0,0 +1,18 @@ +PsiJavaFile:TryIncomplete3.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiCatchSection + PsiKeyword:catch('catch') + PsiJavaToken:LPARENTH('(') + PsiErrorElement:Parameter expected + + PsiErrorElement:')' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete4.txt b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete4.txt new file mode 100644 index 000000000000..464c9a838e30 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete4.txt @@ -0,0 +1,25 @@ +PsiJavaFile:TryIncomplete4.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiCatchSection + PsiKeyword:catch('catch') + PsiJavaToken:LPARENTH('(') + PsiModifierList: + + PsiTypeElement:E + PsiJavaCodeReferenceElement:E + PsiIdentifier:E('E') + PsiReferenceParameterList + + PsiErrorElement:Identifier expected + + PsiErrorElement:')' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete5.txt b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete5.txt new file mode 100644 index 000000000000..c935d14a3d47 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete5.txt @@ -0,0 +1,26 @@ +PsiJavaFile:TryIncomplete5.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiCatchSection + PsiKeyword:catch('catch') + PsiJavaToken:LPARENTH('(') + PsiParameter:e + PsiModifierList: + + PsiTypeElement:E + PsiJavaCodeReferenceElement:E + PsiIdentifier:E('E') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:e('e') + PsiErrorElement:')' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete6.txt b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete6.txt new file mode 100644 index 000000000000..d42266c54c8a --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete6.txt @@ -0,0 +1,27 @@ +PsiJavaFile:TryIncomplete6.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiCatchSection + PsiKeyword:catch('catch') + PsiJavaToken:LPARENTH('(') + PsiParameter:e + PsiModifierList: + + PsiTypeElement:E + PsiJavaCodeReferenceElement:E + PsiIdentifier:E('E') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:e('e') + PsiJavaToken:RPARENTH(')') + PsiErrorElement:'{' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete7.txt b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete7.txt new file mode 100644 index 000000000000..5ddbf4f156c0 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryIncomplete7.txt @@ -0,0 +1,14 @@ +PsiJavaFile:TryIncomplete7.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiKeyword:finally('finally') + PsiErrorElement:'{' expected + + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryNormal0.txt b/java/java-tests/testData/psi/parser-partial/statements/TryNormal0.txt new file mode 100644 index 000000000000..15760ab4aa6a --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryNormal0.txt @@ -0,0 +1,28 @@ +PsiJavaFile:TryNormal0.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiCatchSection + PsiKeyword:catch('catch') + PsiJavaToken:LPARENTH('(') + PsiParameter:e + PsiModifierList: + + PsiTypeElement:E + PsiJavaCodeReferenceElement:E + PsiIdentifier:E('E') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:e('e') + PsiJavaToken:RPARENTH(')') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryNormal1.txt b/java/java-tests/testData/psi/parser-partial/statements/TryNormal1.txt new file mode 100644 index 000000000000..a93b5f624d18 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryNormal1.txt @@ -0,0 +1,32 @@ +PsiJavaFile:TryNormal1.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiCatchSection + PsiKeyword:catch('catch') + PsiJavaToken:LPARENTH('(') + PsiParameter:e + PsiModifierList: + + PsiTypeElement:E + PsiJavaCodeReferenceElement:E + PsiIdentifier:E('E') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:e('e') + PsiJavaToken:RPARENTH(')') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiKeyword:finally('finally') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryNormal2.txt b/java/java-tests/testData/psi/parser-partial/statements/TryNormal2.txt new file mode 100644 index 000000000000..b97b9da92acc --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryNormal2.txt @@ -0,0 +1,15 @@ +PsiJavaFile:TryNormal2.java + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiTryStatement + PsiKeyword:try('try') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiKeyword:finally('finally') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ 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 b86f822bc7e4..1d5cfbccdb5a 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 @@ -66,9 +66,30 @@ public class StatementParserTest extends JavaParsingTestCase { //ReturnParsingTest //SwitchParsingTest - //SynchronizedParsingTest - //ThrowParsingTest - //TryParsingTest + + public void testSyncNormal() { doParserTest("{ synchronized(o){} }"); } + public void testSyncIncomplete0() { doParserTest("{ synchronized }"); } + public void testSyncIncomplete1() { doParserTest("{ synchronized( }"); } + public void testSyncIncomplete2() { doParserTest("{ synchronized(o }"); } + public void testSyncIncomplete3() { doParserTest("{ synchronized(o) }"); } + public void testSyncIncomplete4() { doParserTest("{ synchronized(){} }"); } + public void testSyncIncomplete5() { doParserTest("{ synchronized(\n foo(); }"); } + + public void testThrowNormal() { doParserTest("{ throw e; }"); } + public void testThrowIncomplete0() { doParserTest("{ throw }"); } + public void testThrowIncomplete1() { doParserTest("{ throw e }"); } + + public void testTryNormal0() { doParserTest("{ try{}catch(E e){} }"); } + public void testTryNormal1() { doParserTest("{ try{}catch(E e){}finally{} }"); } + public void testTryNormal2() { doParserTest("{ try{}finally{} }"); } + public void testTryIncomplete0() { doParserTest("{ try }"); } + public void testTryIncomplete1() { doParserTest("{ try{} }"); } + public void testTryIncomplete2() { doParserTest("{ try{}catch }"); } + public void testTryIncomplete3() { doParserTest("{ try{}catch( }"); } + public void testTryIncomplete4() { doParserTest("{ try{}catch(E }"); } + public void testTryIncomplete5() { doParserTest("{ try{}catch(E e }"); } + public void testTryIncomplete6() { doParserTest("{ try{}catch(E e) }"); } + public void testTryIncomplete7() { doParserTest("{ try{}finally }"); } public void testWhileNormal() { doParserTest("{ while (true) foo(); }"); } public void testWhileIncomplete0() { doParserTest("{ while }"); }