From 22d805aedefc28461b1added474be91c719e8f94 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 27 Jan 2015 21:52:45 +0300 Subject: [PATCH] Fixed a bug in import insertion algorithm --- .../kotlin/idea/quickfix/ImportInsertHelperImpl.kt | 13 +++++++++---- ...ConflictingNameAppearsAndHasUsage6.dependency.kt | 3 +++ .../addImport/ConflictingNameAppearsAndHasUsage6.kt | 7 +++++++ .../ConflictingNameAppearsAndHasUsage6.kt.after | 9 +++++++++ .../kotlin/addImport/AddImportTestGenerated.java | 7 +++++++ 5 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.dependency.kt create mode 100644 idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.kt create mode 100644 idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportInsertHelperImpl.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportInsertHelperImpl.kt index bbfb4f62960..cd83a159e68 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportInsertHelperImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportInsertHelperImpl.kt @@ -243,13 +243,16 @@ public class ImportInsertHelperImpl : ImportInsertHelper { .filter(::isVisible) .map { it.getName() } - val aliasNames = imports.map { it.getImportedName() }.filterNotNull().toSet() - var conflictCandidates: List = classNamesToImport - .filter { it.asString() !in aliasNames } + val topLevelScope = resolutionFacade.getFileTopLevelScope(file) + val conflictCandidates: List = classNamesToImport .flatMap { importedScopes.map { scope -> scope.getClassifier(it) }.filterNotNull() } - .filter(::isVisible) + .filter { importedClass -> + isVisible(importedClass) + && topLevelScope.getClassifier(importedClass.getName()) == importedClass /* check that class is really imported */ + && imports.all { it.getImportPath() != ImportPath(importedClass.importableFqNameSafe, false) } /* and not yet imported explicitly */ + } val conflicts = detectNeededImports(conflictCandidates) val addedImport = addImport(parentFqName, true) @@ -288,6 +291,8 @@ public class ImportInsertHelperImpl : ImportInsertHelper { val topLevelScope = resolutionFacade.getFileTopLevelScope(file) val name = target.getName() + // check if there is a conflicting class imported with * import + // (not with explicit import - explicit imports are checked before this method invocation) val classifier = topLevelScope.getClassifier(name) if (classifier != null && detectNeededImports(listOf(classifier)).isNotEmpty()) { return false diff --git a/idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.dependency.kt b/idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.dependency.kt new file mode 100644 index 00000000000..e0120a89d47 --- /dev/null +++ b/idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.dependency.kt @@ -0,0 +1,3 @@ +package dependency + +fun String.Date(p: Int) {} \ No newline at end of file diff --git a/idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.kt b/idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.kt new file mode 100644 index 00000000000..329b45354a4 --- /dev/null +++ b/idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.kt @@ -0,0 +1,7 @@ +// IMPORT: java.util.ArrayList +package p + +import java.sql.* +import dependency.Date // import of function does not affect class name conflict + +val d = Date(1) diff --git a/idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.kt.after b/idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.kt.after new file mode 100644 index 00000000000..8beff2bde44 --- /dev/null +++ b/idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.kt.after @@ -0,0 +1,9 @@ +// IMPORT: java.util.ArrayList +package p + +import java.sql.* +import dependency.Date // import of function does not affect class name conflict +import java.util.* +import java.sql.Date + +val d = Date(1) diff --git a/idea/tests/org/jetbrains/kotlin/addImport/AddImportTestGenerated.java b/idea/tests/org/jetbrains/kotlin/addImport/AddImportTestGenerated.java index 925ced083a0..922efe15bf1 100644 --- a/idea/tests/org/jetbrains/kotlin/addImport/AddImportTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/addImport/AddImportTestGenerated.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.addImport; import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.InnerTestClasses; import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; import org.jetbrains.kotlin.test.JetTestUtils; import org.jetbrains.kotlin.test.TestMetadata; @@ -95,6 +96,12 @@ public class AddImportTestGenerated extends AbstractAddImportTest { doTest(fileName); } + @TestMetadata("ConflictingNameAppearsAndHasUsage6.kt") + public void testConflictingNameAppearsAndHasUsage6() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/addImport/ConflictingNameAppearsAndHasUsage6.kt"); + doTest(fileName); + } + @TestMetadata("ConflictingNameAppearsButUsageIsQualified.kt") public void testConflictingNameAppearsButUsageIsQualified() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/addImport/ConflictingNameAppearsButUsageIsQualified.kt");