From ba09e196d3cc6d27881817d42f07d5f415a4f231 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 29 Nov 2012 16:58:00 +0100 Subject: [PATCH] [^romka] IDEA-96146 Cannot enter 'final' keyword in try-with-resources (cherry-picked from acd831e) --- .../codeInsight/completion/JavaCompletionData.java | 9 +++++++-- .../completion/keywords/finalInTryWithResources.java | 5 +++++ .../codeInsight/completion/KeywordCompletionTest.java | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/finalInTryWithResources.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java index 8f3301c1e798..d9d4a9dfe31a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java @@ -38,7 +38,6 @@ import com.intellij.psi.jsp.JspElementType; import com.intellij.psi.templateLanguages.OuterLanguageElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; -import com.intellij.util.Consumer; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NonNls; @@ -484,7 +483,9 @@ public class JavaCompletionData extends JavaAwareCompletionData { } } - if (isInsideParameterList(position) && !psiElement().afterLeaf(PsiKeyword.FINAL).accepts(position) && !AFTER_DOT.accepts(position)) { + if ((isInsideParameterList(position) || isAtResourceVariableStart(position)) && + !psiElement().afterLeaf(PsiKeyword.FINAL).accepts(position) && + !AFTER_DOT.accepts(position)) { result.addElement(TailTypeDecorator.withTail(createKeyword(position, PsiKeyword.FINAL), TailType.HUMBLE_SPACE_BEFORE_WORD)); } @@ -632,6 +633,10 @@ public class JavaCompletionData extends JavaAwareCompletionData { } } + private static boolean isAtResourceVariableStart(PsiElement position) { + return psiElement().insideStarting(psiElement(PsiTypeElement.class).withParent(PsiResourceList.class)).accepts(position); + } + private static void addBreakContinue(CompletionResultSet result, PsiElement position) { PsiLoopStatement loop = PsiTreeUtil.getParentOfType(position, PsiLoopStatement.class); diff --git a/java/java-tests/testData/codeInsight/completion/keywords/finalInTryWithResources.java b/java/java-tests/testData/codeInsight/completion/keywords/finalInTryWithResources.java new file mode 100644 index 000000000000..f087130fb30d --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/finalInTryWithResources.java @@ -0,0 +1,5 @@ +public class Util { + void foo() { + try () + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/KeywordCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/KeywordCompletionTest.java index 6cee39b7d7a2..ec7b120f74e8 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/KeywordCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/KeywordCompletionTest.java @@ -108,6 +108,7 @@ public class KeywordCompletionTest extends LightCompletionTestCase { public void testReturnInTernary() throws Exception { doTest(1, "return"); } public void testFinalAfterParameterAnno() throws Exception { doTest(2, "final", "float", "class"); } public void testFinalAfterParameterAnno2() throws Exception { doTest(2, "final", "float", "class"); } + public void testFinalInTryWithResources() throws Exception { doTest(1, "final", "float", "class"); } public void testClassInMethod() throws Exception { doTest(2, "class", "char"); } public void testIntInClassArray() throws Throwable { doTest(2, "int", "char", "final"); } public void testIntInClassArray2() throws Throwable { doTest(2, "int", "char", "final"); }