From e143d63f3a70297bd21e0302ae4c9eb6fdd6e462 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 3 Jun 2013 12:03:57 +0400 Subject: [PATCH] IDEA-104969 IDEA should not offer to add class to import section when class already imported --- .../impl/quickfix/ImportClassFixBase.java | 26 +++++++++++++++++++ .../codeInsight/daemon/ImportHelperTest.java | 10 +++++++ 2 files changed, 36 insertions(+) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java index 583753df7ff9..e34ad1820c89 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java @@ -44,12 +44,14 @@ import com.intellij.psi.search.PsiShortNamesCache; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.containers.ContainerUtil; +import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -150,9 +152,33 @@ public abstract class ImportClassFixBase list) { + PsiElement element = myRef.getElement(); + PsiFile containingFile = element == null ? null : element.getContainingFile(); + if (!(containingFile instanceof PsiJavaFile)) return; + PsiJavaFile javaFile = (PsiJavaFile)containingFile; + PsiImportList importList = javaFile.getImportList(); + PsiImportStatementBase[] importStatements = importList == null ? PsiImportStatementBase.EMPTY_ARRAY : importList.getAllImportStatements(); + Set importedNames = new THashSet(importStatements.length); + for (PsiImportStatementBase statement : importStatements) { + PsiJavaCodeReferenceElement ref = statement.getImportReference(); + String name = ref == null ? null : ref.getReferenceName(); + if (name != null && ref.resolve() == null) importedNames.add(name); + } + + for (int i = list.size() - 1; i >= 0; i--) { + PsiClass aClass = list.get(i); + String className = aClass.getName(); + if (className != null && importedNames.contains(className)) { + list.remove(i); + } + } + } + @Nullable protected String getRequiredMemberName(T reference) { return null; diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImportHelperTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImportHelperTest.java index 9761eb47729d..221bff09ccd2 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImportHelperTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImportHelperTest.java @@ -473,4 +473,14 @@ public class ImportHelperTest extends DaemonAnalyzerTestCase { } } + public void testAutoImportIgnoresUnresolvedImportReferences() throws Throwable { + @NonNls String text = "package x; import xxx.yyy.ArrayList; class S {{ ArrayList r; }}"; + configureByText(StdFileTypes.JAVA, text); + + PsiJavaFile javaFile = (PsiJavaFile)getFile(); + PsiReference ref = javaFile.findReferenceAt(getEditor().getCaretModel().getOffset()-1); + ImportClassFix fix = new ImportClassFix((PsiJavaCodeReferenceElement)ref); + assertFalse(fix.isAvailable(getProject(), getEditor(), getFile())); + } + }