diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java index fda74bc70fe6..a549c928659c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java @@ -1,5 +1,7 @@ package com.intellij.codeInsight.completion; +import com.intellij.codeInsight.ExpectedTypeInfo; +import com.intellij.codeInsight.ExpectedTypesProvider; import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.codeInsight.generation.OverrideImplementUtil; import com.intellij.codeInsight.generation.PsiGenerationInfo; @@ -68,7 +70,9 @@ class ConstructorInsertHandler implements InsertHandler 0 && ((PsiTypeLookupItem)delegate).calcGenerics().isEmpty(); + fillTypeArgs = !isRawTypeExpected(context, (PsiTypeLookupItem)delegate) && + psiClass.getTypeParameters().length > 0 && + ((PsiTypeLookupItem)delegate).calcGenerics(position).isEmpty(); delegate.handleInsert(context); PostprocessReformattingAspect.getInstance(context.getProject()).doPostponedFormatting(context.getFile().getViewProvider()); } @@ -95,12 +99,7 @@ class ConstructorInsertHandler implements InsertHandler"); - editor.getCaretModel().moveToOffset(refEnd + 1); - return; - } + if (fillTypeArgs && promptTypeArgs(context, context.getOffset(insideRef))) return; context.setLaterRunnable(generateAnonymousBody(editor, context.getFile())); } @@ -117,9 +116,43 @@ class ConstructorInsertHandler implements InsertHandler"); + context.getEditor().getCaretModel().moveToOffset(offset + 1); + return true; + } + public static boolean insertParentheses(InsertionContext context, LookupItem delegate, final PsiClass psiClass, diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java index 2647a908975e..e93f0c426919 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java @@ -30,7 +30,6 @@ import com.intellij.openapi.project.Project; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.filters.FilterPositionUtil; -import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.javadoc.PsiDocTag; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; @@ -127,12 +126,7 @@ class JavaClassNameInsertHandler implements InsertHandler= 0) { - context.getDocument().insertString(typeArgs, "<>"); - context.getEditor().getCaretModel().moveToOffset(typeArgs + 1); - } + ConstructorInsertHandler.promptTypeArgs(context, context.getOffset(refEnd)); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java index 71afad59c6f8..9f5c265cec82 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java @@ -15,10 +15,7 @@ */ package com.intellij.codeInsight.lookup; -import com.intellij.codeInsight.completion.DefaultInsertHandler; -import com.intellij.codeInsight.completion.InsertHandler; -import com.intellij.codeInsight.completion.InsertionContext; -import com.intellij.codeInsight.completion.JavaPsiClassReferenceElement; +import com.intellij.codeInsight.completion.*; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.util.ClassConditionKey; @@ -74,7 +71,9 @@ public class PsiTypeLookupItem extends LookupItem { @Override public void handleInsert(InsertionContext context) { - context.getDocument().insertString(context.getTailOffset(), calcGenerics()); + PsiElement position = context.getFile().findElementAt(context.getStartOffset()); + assert position != null; + context.getDocument().insertString(context.getTailOffset(), calcGenerics(position)); DefaultInsertHandler.addImportForItem(context, this); PostprocessReformattingAspect.getInstance(context.getProject()).doPostponedFormatting(); @@ -99,18 +98,21 @@ public class PsiTypeLookupItem extends LookupItem { } } - public String calcGenerics() { + public String calcGenerics(@NotNull PsiElement context) { if (myDiamond) { return "<>"; } if (getObject() instanceof PsiClass) { PsiClass psiClass = (PsiClass)getObject(); + PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(psiClass.getProject()).getResolveHelper(); PsiSubstitutor substitutor = getSubstitutor(); StringBuilder builder = new StringBuilder(); for (PsiTypeParameter parameter : psiClass.getTypeParameters()) { PsiType substitute = substitutor.substitute(parameter); - if (substitute == null || PsiUtil.resolveClassInType(substitute) == parameter) { + if (substitute == null || + (PsiUtil.resolveClassInType(substitute) == parameter && + resolveHelper.resolveReferencedClass(parameter.getName(), context) != CompletionUtil.getOriginalOrSelf(parameter))) { return ""; } if (builder.length() > 0) { diff --git a/java/java-tests/testData/codeInsight/completion/smartType/SameTypeArg-out.java b/java/java-tests/testData/codeInsight/completion/smartType/SameTypeArg-out.java new file mode 100644 index 000000000000..62646eb12eba --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/SameTypeArg-out.java @@ -0,0 +1,5 @@ +class Bar { + { + Bar f = new Bar(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/SameTypeArg.java b/java/java-tests/testData/codeInsight/completion/smartType/SameTypeArg.java new file mode 100644 index 000000000000..bdb1c4593ce1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/SameTypeArg.java @@ -0,0 +1,5 @@ +class Bar { + { + Bar f = new + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/UnboundTypeArgs2-out.java b/java/java-tests/testData/codeInsight/completion/smartType/UnboundTypeArgs2-out.java new file mode 100644 index 000000000000..99659b5dc1a3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/UnboundTypeArgs2-out.java @@ -0,0 +1,8 @@ +interface Foo {} +class FooEx implements Foo {} + +class Bar { + { + Foo f = new FooEx<>(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/UnboundTypeArgs2.java b/java/java-tests/testData/codeInsight/completion/smartType/UnboundTypeArgs2.java new file mode 100644 index 000000000000..4787cde90915 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/UnboundTypeArgs2.java @@ -0,0 +1,8 @@ +interface Foo {} +class FooEx implements Foo {} + +class Bar { + { + Foo f = new FE + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java index b4994109edbf..4623705d0f42 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java @@ -895,6 +895,8 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { public void testIfConditionExpectedType() throws Exception { doTest(); } public void testUnboundTypeArgs() throws Exception { doTest(); } + public void testUnboundTypeArgs2() throws Exception { doTest(); } + public void testSameTypeArg() throws Exception { doTest(); } public void testIDEADEV2668() throws Exception { doTest();