From fe0824b7e22963d360fc5bbf05dd5b166bebe6c6 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 10 Jun 2016 19:38:53 +0300 Subject: [PATCH] more useful parse of broken try-with-resources resource expression (IDEA-157118) --- .../daemon/impl/analysis/HighlightUtil.java | 3 ++- .../lang/java/parser/DeclarationParser.java | 3 ++- .../src/messages/JavaErrorMessages.properties | 1 + .../advHighlighting9/TryWithResources.java | 12 ++++++++++ .../parser-partial/statements/TryNormal11.txt | 22 ++++++++++++++++++ .../parser-partial/statements/TryNormal12.txt | 23 +++++++++++++++++++ .../parser/partial/StatementParserTest.java | 4 +++- 7 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/psi/parser-partial/statements/TryNormal11.txt create mode 100644 java/java-tests/testData/psi/parser-partial/statements/TryNormal12.txt diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 59efc131a995..9610b22aaac3 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -1784,7 +1784,8 @@ public class HighlightUtil extends HighlightUtilBase { return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(text).create(); } - return null; + String text = JavaErrorMessages.message("declaration.or.variable.expected"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(text).create(); } @Nullable diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index 7a77bb94fa7a..60fb8899e803 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -49,7 +49,8 @@ public class DeclarationParser { private static final TokenSet TYPE_START = TokenSet.orSet( ElementType.PRIMITIVE_TYPE_BIT_SET, TokenSet.create(JavaTokenType.IDENTIFIER, JavaTokenType.AT)); private static final TokenSet RESOURCE_EXPRESSIONS = TokenSet.create( - JavaElementType.REFERENCE_EXPRESSION, JavaElementType.THIS_EXPRESSION); + JavaElementType.REFERENCE_EXPRESSION, JavaElementType.THIS_EXPRESSION, + JavaElementType.METHOD_CALL_EXPRESSION, JavaElementType.NEW_EXPRESSION); private static final String WHITESPACES = "\n\r \t"; private static final String LINE_ENDS = "\n\r"; diff --git a/java/java-psi-impl/src/messages/JavaErrorMessages.properties b/java/java-psi-impl/src/messages/JavaErrorMessages.properties index 9514bbfa4d1f..1e79e28c5617 100644 --- a/java/java-psi-impl/src/messages/JavaErrorMessages.properties +++ b/java/java-psi-impl/src/messages/JavaErrorMessages.properties @@ -145,6 +145,7 @@ variable.must.be.final=Variable ''{0}'' is accessed from within inner class, nee variable.must.be.final.or.effectively.final=Variable ''{0}'' is accessed from within inner class, needs to be final or effectively final lambda.variable.must.be.final=Variable used in lambda expression should be final or effectively final resource.variable.must.be.final=Variable used as a try-with-resources resource should be final or effectively final +declaration.or.variable.expected=Declaration, final or effectively final variable expected initializer.must.be.able.to.complete.normally=Initializer must be able to complete normally weaker.privileges={0}; attempting to assign weaker access privileges (''{1}''); was ''{2}'' incompatible.return.type=attempting to use incompatible return type diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/TryWithResources.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/TryWithResources.java index 06fbe51f4f67..e7665f8facda 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/TryWithResources.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/TryWithResources.java @@ -42,4 +42,16 @@ class TryWithResources { System.out.println(r); } } + + static class Resource implements AutoCloseable { + static Resource create() { + return new Resource(); + } + @Override public void close() { } + } + + void testMoreUsefulParseForIncorrectExpression() { + try (new Resource()) {} + try (Resource.create()) {} + } } diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryNormal11.txt b/java/java-tests/testData/psi/parser-partial/statements/TryNormal11.txt new file mode 100644 index 000000000000..4559bd4571fe --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryNormal11.txt @@ -0,0 +1,22 @@ +PsiJavaFile:TryNormal11.java + PsiTryStatement + PsiKeyword:try('try') + PsiResourceList:(new R()) + PsiJavaToken:LPARENTH('(') + PsiResourceExpression + PsiNewExpression:new R() + PsiKeyword:new('new') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:R + PsiIdentifier:R('R') + PsiReferenceParameterList + + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:RPARENTH(')') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/TryNormal12.txt b/java/java-tests/testData/psi/parser-partial/statements/TryNormal12.txt new file mode 100644 index 000000000000..5cff459f612e --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/statements/TryNormal12.txt @@ -0,0 +1,23 @@ +PsiJavaFile:TryNormal12.java + PsiTryStatement + PsiKeyword:try('try') + PsiResourceList:(R.create()) + PsiJavaToken:LPARENTH('(') + PsiResourceExpression + PsiMethodCallExpression:R.create() + PsiReferenceExpression:R.create + PsiReferenceExpression:R + PsiReferenceParameterList + + PsiIdentifier:R('R') + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:create('create') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:RPARENTH(')') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + 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 a5535eb0971f..b8255c606323 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 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -145,6 +145,8 @@ public class StatementParserTest extends JavaParsingTestCase { public void testTryIncomplete16() { doParserTest("try(R r =){}"); } public void testTryIncomplete17() { doParserTest("try(R r = 0;;){}"); } public void testTryIncomplete18() { doParserTest("try(R r){}"); } + public void testTryNormal11() { doParserTest("try(new R()){}"); } + public void testTryNormal12() { doParserTest("try(R.create()){}"); } public void testWhileNormal() { doParserTest("while (true) foo();"); } public void testWhileIncomplete0() { doParserTest("while"); }