diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java index 869a0d1aa5eb..fe58d856404f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java @@ -396,7 +396,7 @@ public class JavaKeywordCompletion { } } - if ((isInsideParameterList(myPosition) || isAtResourceVariableStart(myPosition) || isAtCatchVariableStart(myPosition)) && + if ((isInsideParameterList(myPosition) || isAtCatchOrResourceVariableStart(myPosition)) && !psiElement().afterLeaf(PsiKeyword.FINAL).accepts(myPosition) && !AFTER_DOT.accepts(myPosition)) { addKeyword(TailTypeDecorator.withTail(createKeyword(PsiKeyword.FINAL), TailType.HUMBLE_SPACE_BEFORE_WORD)); @@ -732,12 +732,14 @@ public class JavaKeywordCompletion { info -> InheritanceUtil.isInheritor(info.getType(), CommonClassNames.JAVA_LANG_CLASS)) != null; } - private static boolean isAtResourceVariableStart(PsiElement position) { - return psiElement().insideStarting(psiElement(PsiTypeElement.class).withParent(PsiResourceList.class)).accepts(position); - } - - private static boolean isAtCatchVariableStart(PsiElement position) { - return psiElement().insideStarting(psiElement(PsiTypeElement.class).withParent(PsiCatchSection.class)).accepts(position); + private static boolean isAtCatchOrResourceVariableStart(PsiElement position) { + PsiElement type = PsiTreeUtil.getParentOfType(position, PsiTypeElement.class); + if (type != null && type.getTextRange().getStartOffset() == position.getTextRange().getStartOffset()) { + PsiElement parent = type.getParent(); + if (parent instanceof PsiVariable) parent = parent.getParent(); + return parent instanceof PsiCatchSection || parent instanceof PsiResourceList; + } + return false; } private void addBreakContinue() { diff --git a/java/java-tests/testData/codeInsight/completion/keywords/finalInCompleteCatch.java b/java/java-tests/testData/codeInsight/completion/keywords/finalInCompleteCatch.java new file mode 100644 index 000000000000..b907799d7799 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/finalInCompleteCatch.java @@ -0,0 +1,9 @@ +public class X { + { + try { + + } catch ( AssertionError error) { + + } + } +} diff --git a/java/java-tests/testData/codeInsight/completion/keywords/finalInCompleteTryWithResources.java b/java/java-tests/testData/codeInsight/completion/keywords/finalInCompleteTryWithResources.java new file mode 100644 index 000000000000..72ccabe6f4a3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/finalInCompleteTryWithResources.java @@ -0,0 +1,5 @@ +public class Util { + void foo() { + try ( Type var = val) + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java index b7618975aaf1..e90a9aafa7ee 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java @@ -139,7 +139,9 @@ public class KeywordCompletionTest extends LightCompletionTestCase { public void testNoCaseInsideWhileInSwitch() { doTest(0, "case", "default"); } public void testFinalInCatch() { doTest(1, "final"); } public void testFinalInIncompleteCatch() { doTest(1, "final"); } + public void testFinalInCompleteCatch() { doTest(1, "final"); } public void testFinalInTryWithResources() { doTest(1, "final", "float", "class"); } + public void testFinalInCompleteTryWithResources() { doTest(1, "final", "float", "class"); } public void testFinalInLambda() { doTest(2, "final", "float"); } public void testNoFinalAfterTryBody() { doTest(1, "final", "finally"); } public void testClassInMethod() { doTest(2, "class", "char"); }