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 889549d66e3d..3eb7b1cb2b29 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java @@ -457,6 +457,29 @@ public class JavaKeywordCompletion { addKeyword(createKeyword(PsiKeyword.FALSE)); } } + + if (isQualifiedNewContext()) { + addKeyword(createKeyword(PsiKeyword.NEW)); + } + } + + private boolean isQualifiedNewContext() { + if (myPosition.getParent() instanceof PsiReferenceExpression) { + PsiExpression qualifier = ((PsiReferenceExpression)myPosition.getParent()).getQualifierExpression(); + PsiClass qualifierClass = PsiUtil.resolveClassInClassTypeOnly(qualifier == null ? null : qualifier.getType()); + if (qualifierClass != null && + ContainerUtil.exists(qualifierClass.getAllInnerClasses(), inner -> canBeCreatedInQualifiedNew(qualifierClass, inner))) { + return true; + } + } + return false; + } + + private boolean canBeCreatedInQualifiedNew(PsiClass outer, PsiClass inner) { + PsiMethod[] constructors = inner.getConstructors(); + return !inner.hasModifierProperty(PsiModifier.STATIC) && + PsiUtil.isAccessible(inner, myPosition, outer) && + (constructors.length == 0 || ContainerUtil.exists(constructors, c -> PsiUtil.isAccessible(c, myPosition, outer))); } private void addFileHeaderKeywords() { diff --git a/java/java-tests/testData/codeInsight/completion/keywords/qualifiedNew.java b/java/java-tests/testData/codeInsight/completion/keywords/qualifiedNew.java new file mode 100644 index 000000000000..aa464a734465 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/qualifiedNew.java @@ -0,0 +1,10 @@ +public class Test { + public Inner getInner() { + return this. + } + + public class Inner { + public void foo() { + } + } +} \ No newline at end of file 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 e4696d341a88..2e26d7d90996 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 @@ -153,6 +153,7 @@ public class KeywordCompletionTest extends LightCompletionTestCase { public void testNoStatementInForLoopCondition() { doTest(0, "synchronized", "if"); } public void testNoStatementInForLoopUpdate() { doTest(0, "synchronized", "if"); } public void testPrivateInJava9Interface() { setLanguageLevel(LanguageLevel.JDK_1_9); doTest(); } + public void testQualifiedNew() { doTest(1, "new"); } public void testOverwriteCatch() { configureByTestName();