diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java index bbc61536e296..a420ee8bdf01 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.ExpectedTypeInfo; import com.intellij.codeInsight.daemon.impl.analysis.HighlightClassUtil; import com.intellij.codeInsight.lookup.*; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.filters.getters.ExpectedTypesGetter; @@ -158,13 +159,22 @@ public class JavaInheritorsGetter extends CompletionProvider()", parameters.getPosition()); - final PsiVariable declaredVar = (PsiVariable)((PsiDeclarationStatement)statement).getDeclaredElements()[0]; - final PsiNewExpression initializer = (PsiNewExpression)declaredVar.getInitializer(); - final boolean hasDefaultConstructorOrNoGenericsOne = PsiDiamondTypeImpl.hasDefaultConstructor(psiClass) || - !PsiDiamondTypeImpl.haveConstructorsGenericsParameters(psiClass); - if (hasDefaultConstructorOrNoGenericsOne) { + boolean hasDefaultConstructor = PsiDiamondTypeImpl.hasDefaultConstructor(psiClass); + boolean hasConstructorWithGenericsParameters = PsiDiamondTypeImpl.haveConstructorsGenericsParameters(psiClass); + if (hasDefaultConstructor || !hasConstructorWithGenericsParameters) { + String args; + if (hasDefaultConstructor) { + args = ""; + } + else { + //just try to resolve to the first constructor + PsiParameter[] constructorParams = psiClass.getConstructors()[0].getParameterList().getParameters(); + args = StringUtil.join(constructorParams, p -> PsiTypesUtil.getDefaultValueOfType(p.getType()), ","); + } + final PsiStatement statement = elementFactory + .createStatementFromText(canonicalText + " v = new " + erasedText + "<>(" + args + ")", parameters.getPosition()); + final PsiVariable declaredVar = (PsiVariable)((PsiDeclarationStatement)statement).getDeclaredElements()[0]; + final PsiNewExpression initializer = (PsiNewExpression)declaredVar.getInitializer(); final PsiDiamondTypeImpl.DiamondInferenceResult inferenceResult = PsiDiamondTypeImpl.resolveInferredTypes(initializer); if (inferenceResult.getErrorMessage() == null && !psiClass.hasModifierProperty(PsiModifier.ABSTRACT) && diff --git a/java/java-tests/testData/codeInsight/completion/smartType/DiamondCollapsedWithOverloadedConstructors-out.java b/java/java-tests/testData/codeInsight/completion/smartType/DiamondCollapsedWithOverloadedConstructors-out.java new file mode 100644 index 000000000000..65b82bb7ccd0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/DiamondCollapsedWithOverloadedConstructors-out.java @@ -0,0 +1,12 @@ + +class Test { + + { + Foo f = new Foo<>(); + } +} + +class Foo { + public Foo(String description) {} + public Foo(int size) {} +} diff --git a/java/java-tests/testData/codeInsight/completion/smartType/DiamondCollapsedWithOverloadedConstructors.java b/java/java-tests/testData/codeInsight/completion/smartType/DiamondCollapsedWithOverloadedConstructors.java new file mode 100644 index 000000000000..823fe9a0ea0c --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/DiamondCollapsedWithOverloadedConstructors.java @@ -0,0 +1,12 @@ + +class Test { + + { + Foo f = new + } +} + +class Foo { + public Foo(String description) {} + public Foo(int size) {} +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType17CompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType17CompletionTest.java index b73ca787368f..5a99f399118a 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType17CompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType17CompletionTest.java @@ -48,6 +48,10 @@ public class SmartType17CompletionTest extends LightFixtureCompletionTestCase { doTest(); } + public void testDiamondCollapsedWithOverloadedConstructors() { + doTest(); + } + public void testDiamondNotCollapsed() { doTest(); }