From f39f6107b7f1cbf8a28869e3485496d94bab8a63 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 10 Nov 2010 12:54:00 +0300 Subject: [PATCH] IDEA-33405 --- .../impl/source/codeStyle/ImportHelper.java | 30 ++++++++++++++++++- .../codeInsight/daemon/ImportHelperTest.java | 20 +++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java index 0c4a38e000ec..276c6771dc4f 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java @@ -21,6 +21,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.CodeStyleSettings; @@ -468,7 +469,7 @@ public class ImportHelper{ return array; } - private static PsiClass findSingleImportByShortName(@NotNull PsiJavaFile file, @NotNull String shortClassName){ + private static PsiClass findSingleImportByShortName(@NotNull final PsiJavaFile file, @NotNull String shortClassName){ PsiClass[] refs = file.getSingleClassImports(true); for (PsiClass ref : refs) { String className = ref.getQualifiedName(); @@ -482,6 +483,33 @@ public class ImportHelper{ return aClass; } } + + // there maybe a class imported implicitly from current package + String packageName = file.getPackageName(); + if (!StringUtil.isEmptyOrSpaces(packageName)) { + String fqn = packageName + "." + shortClassName; + final PsiClass aClass = JavaPsiFacade.getInstance(file.getProject()).findClass(fqn, file.getResolveScope()); + if (aClass != null) { + final boolean[] foundRef = {false}; + // check if that short name referenced in the file + file.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitElement(PsiElement element) { + if (foundRef[0]) return; + super.visitElement(element); + } + + @Override + public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { + if (file.getManager().areElementsEquivalent(reference.resolve(), aClass)) { + foundRef[0] = true; + } + super.visitReferenceElement(reference); + } + }); + if (foundRef[0]) return aClass; + } + } 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 865742929ad6..9570f743409f 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImportHelperTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImportHelperTest.java @@ -150,8 +150,8 @@ public class ImportHelperTest extends DaemonAnalyzerTestCase { ImportHelper importHelper = new ImportHelper(settings); PsiClass psiClass = JavaPsiFacade.getInstance(getProject()).findClass(fqn, GlobalSearchScope.allScope(getProject())); - boolean b = importHelper.addImport(file, psiClass); - assertTrue(b); + boolean b = importHelper.addImport(file, psiClass); + assertTrue(b); assertOrder(file, expectedOrder); } @@ -193,6 +193,22 @@ public class ImportHelperTest extends DaemonAnalyzerTestCase { String text = LoadTextUtil.loadText(vFile).toString(); assertEquals(text, getFile().getText()); } + public void testConflictingClassesFromCurrentPackage() throws Throwable { + final PsiFile file = configureByText(StdFileTypes.JAVA, "package java.util; class X{ Date d;}"); + assertEmpty(filter(doHighlighting(), HighlightSeverity.ERROR)); + + new WriteCommandAction.Simple(getProject()) { + @Override + protected void run() throws Throwable { + CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); + ImportHelper importHelper = new ImportHelper(settings); + + PsiClass psiClass = JavaPsiFacade.getInstance(getProject()).findClass("java.sql.Date", GlobalSearchScope.allScope(getProject())); + boolean b = importHelper.addImport((PsiJavaFile)file, psiClass); + assertFalse(b); // must fail + } + }.execute().throwException(); + } @DoNotWrapInCommand public void testAutoImportCaretLocation() throws Throwable {