Import: IDE should import class from root package
#KT-21422 Fixed
This commit is contained in:
@@ -51,6 +51,7 @@ import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors
|
|||||||
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
|
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
|
||||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.isOneSegmentFQN
|
||||||
import org.jetbrains.kotlin.name.parentOrNull
|
import org.jetbrains.kotlin.name.parentOrNull
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
@@ -239,18 +240,21 @@ class KotlinAddImportAction internal constructor(
|
|||||||
// for class or package we use ShortenReferences because we not necessary insert an import but may want to
|
// for class or package we use ShortenReferences because we not necessary insert an import but may want to
|
||||||
// insert partly qualified name
|
// insert partly qualified name
|
||||||
|
|
||||||
val importAlias = descriptor.importableFqName?.let { file.findAliasByFqName(it) }
|
val importableFqName = descriptor.importableFqName
|
||||||
if (importAlias != null || descriptor is ClassDescriptor || descriptor is PackageViewDescriptor) {
|
val importAlias = importableFqName?.let { file.findAliasByFqName(it) }
|
||||||
|
if (importableFqName?.isOneSegmentFQN() != true &&
|
||||||
|
(importAlias != null || descriptor is ClassDescriptor || descriptor is PackageViewDescriptor)
|
||||||
|
) {
|
||||||
if (element is KtSimpleNameExpression) {
|
if (element is KtSimpleNameExpression) {
|
||||||
if (importAlias != null) {
|
if (importAlias != null) {
|
||||||
importAlias.nameIdentifier?.copy()?.let { element.getIdentifier()?.replace(it) }
|
importAlias.nameIdentifier?.copy()?.let { element.getIdentifier()?.replace(it) }
|
||||||
val resultDescriptor = element.resolveMainReferenceToDescriptors().firstOrNull()
|
val resultDescriptor = element.resolveMainReferenceToDescriptors().firstOrNull()
|
||||||
if (descriptor.importableFqName == resultDescriptor?.importableFqName) {
|
if (importableFqName == resultDescriptor?.importableFqName) {
|
||||||
return@forEach
|
return@forEach
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
descriptor.importableFqName?.let {
|
importableFqName?.let {
|
||||||
element.mainReference.bindToFqName(
|
element.mainReference.bindToFqName(
|
||||||
it,
|
it,
|
||||||
KtSimpleNameReference.ShorteningMode.FORCED_SHORTENING
|
KtSimpleNameReference.ShorteningMode.FORCED_SHORTENING
|
||||||
@@ -343,8 +347,7 @@ private class SingleImportVariant(
|
|||||||
val descriptors: Collection<DeclarationDescriptor>
|
val descriptors: Collection<DeclarationDescriptor>
|
||||||
) : AutoImportVariant {
|
) : AutoImportVariant {
|
||||||
override val descriptorsToImport: Collection<DeclarationDescriptor>
|
override val descriptorsToImport: Collection<DeclarationDescriptor>
|
||||||
get() =
|
get() = listOf(descriptors.singleOrNull() ?: descriptors.minBy { if (it is ClassDescriptor) 0 else 1 }!!)
|
||||||
listOf(descriptors.singleOrNull() ?: descriptors.sortedBy { if (it is ClassDescriptor) 0 else 1 }.first())
|
|
||||||
|
|
||||||
override val hint: String get() = excludeFqNameCheck.asString()
|
override val hint: String get() = excludeFqNameCheck.asString()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
class RootClass
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
// IMPORT: class: RootClass
|
||||||
|
package non.root.name
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
RootClass()
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// IMPORT: class: RootClass
|
||||||
|
package non.root.name
|
||||||
|
|
||||||
|
import RootClass
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
RootClass()
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// "Import" "true"
|
||||||
|
// ERROR: Unresolved reference: RootClass
|
||||||
|
package non.root.name
|
||||||
|
|
||||||
|
import RootClass
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
RootClass()
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
class RootClass
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Import" "true"
|
||||||
|
// ERROR: Unresolved reference: RootClass
|
||||||
|
package non.root.name
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
RootClass<caret>()
|
||||||
|
}
|
||||||
@@ -199,6 +199,11 @@ public class AddImportTestGenerated extends AbstractAddImportTest {
|
|||||||
runTest("idea/testData/addImport/ImportFromObject.kt");
|
runTest("idea/testData/addImport/ImportFromObject.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ImportFromRoot.kt")
|
||||||
|
public void testImportFromRoot() throws Exception {
|
||||||
|
runTest("idea/testData/addImport/ImportFromRoot.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ImportFunctionBug.kt")
|
@TestMetadata("ImportFunctionBug.kt")
|
||||||
public void testImportFunctionBug() throws Exception {
|
public void testImportFunctionBug() throws Exception {
|
||||||
runTest("idea/testData/addImport/ImportFunctionBug.kt");
|
runTest("idea/testData/addImport/ImportFunctionBug.kt");
|
||||||
|
|||||||
+5
@@ -633,6 +633,11 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes
|
|||||||
runTest("idea/testData/quickfix/autoImports/importAliasPropertyAlreadyExists.before.Main.kt");
|
runTest("idea/testData/quickfix/autoImports/importAliasPropertyAlreadyExists.before.Main.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("importFromRoot.before.Main.kt")
|
||||||
|
public void testImportFromRoot() throws Exception {
|
||||||
|
runTest("idea/testData/quickfix/autoImports/importFromRoot.before.Main.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("importInFirstPartInQualifiedExpression.before.Main.kt")
|
@TestMetadata("importInFirstPartInQualifiedExpression.before.Main.kt")
|
||||||
public void testImportInFirstPartInQualifiedExpression() throws Exception {
|
public void testImportInFirstPartInQualifiedExpression() throws Exception {
|
||||||
runTest("idea/testData/quickfix/autoImports/importInFirstPartInQualifiedExpression.before.Main.kt");
|
runTest("idea/testData/quickfix/autoImports/importInFirstPartInQualifiedExpression.before.Main.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user