diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index 0733f3151d97..fba10a633432 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -644,7 +644,20 @@ public class JavaCompletionContributor extends CompletionContributor { if (file instanceof PsiJavaFile) { if (context.getInvocationCount() > 0) { autoImport(file, context.getStartOffset() - 1, context.getEditor()); - PsiDocumentManager.getInstance(context.getProject()).commitDocument(context.getEditor().getDocument()); + + PsiElement leaf = file.findElementAt(context.getStartOffset() - 1); + if (leaf != null) leaf = PsiTreeUtil.prevVisibleLeaf(leaf); + + PsiVariable variable = PsiTreeUtil.getParentOfType(leaf, PsiVariable.class); + if (variable != null) { + PsiTypeElement typeElement = variable.getTypeElement(); + if (typeElement != null) { + PsiType type = typeElement.getType(); + if (type instanceof PsiClassType && ((PsiClassType)type).resolve() == null) { + autoImportReference(file, context.getEditor(), typeElement.getInnermostComponentReferenceElement()); + } + } + } } JavaCompletionUtil.initOffsets(file, context.getOffsetMap()); @@ -727,7 +740,7 @@ public class JavaCompletionContributor extends CompletionContributor { return iterator.getTokenType() == JavaTokenType.EQ || iterator.getTokenType() == JavaTokenType.LPARENTH; } - private static void autoImport(final PsiFile file, int offset, final Editor editor) { + private static void autoImport(@NotNull final PsiFile file, int offset, @NotNull final Editor editor) { final CharSequence text = editor.getDocument().getCharsSequence(); while (offset > 0 && Character.isJavaIdentifierPart(text.charAt(offset))) offset--; if (offset <= 0) return; @@ -740,7 +753,10 @@ public class JavaCompletionContributor extends CompletionContributor { while (offset > 0 && Character.isWhitespace(text.charAt(offset))) offset--; if (offset <= 0) return; - PsiJavaCodeReferenceElement element = extractReference(PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiExpression.class, false)); + autoImportReference(file, editor, extractReference(PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiExpression.class, false))); + } + + private static void autoImportReference(@NotNull PsiFile file, @NotNull Editor editor, @Nullable PsiJavaCodeReferenceElement element) { if (element == null) return; while (true) { @@ -751,6 +767,7 @@ public class JavaCompletionContributor extends CompletionContributor { } if (!(element.getParent() instanceof PsiMethodCallExpression) && element.multiResolve(true).length == 0) { new ImportClassFix(element).doFix(editor, false, false); + PsiDocumentManager.getInstance(file.getProject()).commitDocument(editor.getDocument()); } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/AutoImportExpectedType.java b/java/java-tests/testData/codeInsight/completion/smartType/AutoImportExpectedType.java new file mode 100644 index 000000000000..e120ecb7bd2b --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/AutoImportExpectedType.java @@ -0,0 +1,5 @@ +class Main { + { + List list = new + } +} \ 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 ed2b792fc5a9..d2e8825cc16d 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java @@ -1029,6 +1029,19 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { assertStringItems("Bar", "Goo"); } + public void testAutoImportExpectedType() throws Throwable { + boolean old = CodeInsightSettings.getInstance().ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY; + CodeInsightSettings.getInstance().ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY = true; + try { + configureByTestName(); + performAction(); + myFixture.assertPreferredCompletionItems(1, "List", "ArrayList", "AbstractList"); + } + finally { + CodeInsightSettings.getInstance().ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY = old; + } + } + public void testNoWrongSubstitutorFromStats() throws Throwable { doTest(); FileDocumentManager.getInstance().saveDocument(myFixture.getEditor().getDocument());