Fixed a bug in import insertion algorithm

This commit is contained in:
Valentin Kipyatkov
2015-01-27 21:52:45 +03:00
parent ef8be9560a
commit 22d805aede
5 changed files with 35 additions and 4 deletions
@@ -243,13 +243,16 @@ public class ImportInsertHelperImpl : ImportInsertHelper {
.filter(::isVisible)
.map { it.getName() }
val aliasNames = imports.map { it.getImportedName() }.filterNotNull().toSet()
var conflictCandidates: List<ClassifierDescriptor> = classNamesToImport
.filter { it.asString() !in aliasNames }
val topLevelScope = resolutionFacade.getFileTopLevelScope(file)
val conflictCandidates: List<ClassifierDescriptor> = 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
@@ -0,0 +1,3 @@
package dependency
fun String.Date(p: Int) {}
@@ -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)
@@ -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)
@@ -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");