diff --git a/idea/src/org/jetbrains/kotlin/idea/imports/ImportsUtils.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ImportsUtils.kt similarity index 100% rename from idea/src/org/jetbrains/kotlin/idea/imports/ImportsUtils.kt rename to idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ImportsUtils.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ShortenReferences.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ShortenReferences.kt index e53cf1231a9..edd513b7ab3 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ShortenReferences.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ShortenReferences.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ThisReceiver import org.jetbrains.kotlin.idea.util.ShortenReferences.Options +import org.jetbrains.kotlin.idea.imports.* public class ShortenReferences(val options: (JetElement) -> Options = { Options.DEFAULT }) { public data class Options( @@ -61,25 +62,12 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options. val targets = context[BindingContext.REFERENCE_TARGET, this]?.let { listOf(it) } ?: context[BindingContext.AMBIGUOUS_REFERENCE_TARGET, this] ?: listOf() - return targets.map { descriptorToImport(it) }.toSet() - } - - private fun descriptorToImport(target: DeclarationDescriptor): DeclarationDescriptor { - val descriptor = target.getImportableDescriptor() - // if there is a class with the same fq-name then prefer to consider it as target (otherwise we won't insert import) - if (descriptor is CallableDescriptor) { - val container = descriptor.getContainingDeclaration() - if (container is PackageFragmentDescriptor) { - val classifier = container.getMemberScope().getClassifier(descriptor.getName()) - if (classifier != null) return classifier - } - } - return descriptor + return targets.map { it.getImportableDescriptor() }.toSet() } private fun mayImport(descriptor: DeclarationDescriptor, file: JetFile): Boolean { - if (descriptor !is ClassDescriptor && descriptor !is PackageViewDescriptor) return false - return ImportInsertHelper.getInstance(file.getProject()).mayImportByCodeStyle(descriptor) + return descriptor.canBeReferencedViaImport() + && ImportInsertHelper.getInstance(file.getProject()).mayImportByCodeStyle(descriptor) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt index 0aa47ba209e..e03bb6ec238 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt @@ -257,7 +257,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor() - val descriptorsToImport = ArrayList() + val extensionsToImport = ArrayList() for ((reference, refData) in referencesToRestore) { val fqName = FqName(refData.fqName) @@ -266,13 +266,12 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor importable.getContainingDeclaration() is PackageFragmentDescriptor // do not import nested classes is PackageViewDescriptor -> JetCodeStyleSettings.getInstance(project).IMPORT_PACKAGES - else -> true + else -> importable.getContainingDeclaration() is PackageFragmentDescriptor // do not import nested classes and non-top-level declarations } } diff --git a/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt b/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt index 70aac4d1ac1..43f402120aa 100644 --- a/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt +++ b/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt @@ -1,7 +1,7 @@ package to -import a.with import a.Outer +import a.with fun f(p1: Outer.Nested.NN, p2: Outer.Nested.NI, p3: Outer.Inner.II) { Outer.Nested.NN2() diff --git a/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.expected.kt b/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.expected.kt index ac9b156c292..cc95da25940 100644 --- a/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.expected.kt +++ b/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.expected.kt @@ -1,11 +1,11 @@ package to -import d.g -import d.c import d.ext import d.A import d.T import d.Outer +import d.c +import d.g import d.O1 import d.O2 import d.E diff --git a/idea/testData/copyPaste/imports/ImportDependency.expected.kt b/idea/testData/copyPaste/imports/ImportDependency.expected.kt index ac9b156c292..cc95da25940 100644 --- a/idea/testData/copyPaste/imports/ImportDependency.expected.kt +++ b/idea/testData/copyPaste/imports/ImportDependency.expected.kt @@ -1,11 +1,11 @@ package to -import d.g -import d.c import d.ext import d.A import d.T import d.Outer +import d.c +import d.g import d.O1 import d.O2 import d.E diff --git a/idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.expected.kt b/idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.expected.kt index 4e6273d6252..c93da31508f 100644 --- a/idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.expected.kt +++ b/idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.expected.kt @@ -1,7 +1,7 @@ package to -import a.f import a.ext +import a.f fun g() { f { diff --git a/idea/testData/refactoring/move/kotlin/moveFile/internalReferences/after/source/some.kt b/idea/testData/refactoring/move/kotlin/moveFile/internalReferences/after/source/some.kt index 86569cdb0fa..e6370730cd0 100644 --- a/idea/testData/refactoring/move/kotlin/moveFile/internalReferences/after/source/some.kt +++ b/idea/testData/refactoring/move/kotlin/moveFile/internalReferences/after/source/some.kt @@ -1,5 +1,6 @@ package source import target.A +import target.test -fun test1() = target.test(A()) \ No newline at end of file +fun test1() = test(A()) \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveFile/moveFileWithPackageRename/after/c/noImports.kt b/idea/testData/refactoring/move/kotlin/moveFile/moveFileWithPackageRename/after/c/noImports.kt index fcfdc162883..379acf19964 100644 --- a/idea/testData/refactoring/move/kotlin/moveFile/moveFileWithPackageRename/after/c/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveFile/moveFileWithPackageRename/after/c/noImports.kt @@ -1,10 +1,12 @@ package c import b.Test +import b.test +import b.TEST fun bar() { val t: Test = Test() - b.test() - println(b.TEST) - b.TEST = "" + test() + println(TEST) + TEST = "" } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/_a/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/_a/noImports.kt index 93d5d1f09de..576a8bd2bee 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/_a/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/_a/noImports.kt @@ -1,5 +1,7 @@ package a +import b.test + fun bar() { - b.test() + test() } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/a/main.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/a/main.kt index f90b20c77b1..38f0bec9dde 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/a/main.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/a/main.kt @@ -1,7 +1,9 @@ package a +import b.test + class Test { fun foo() { - b.test() + test() } } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/a/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/a/noImports.kt index 93d5d1f09de..576a8bd2bee 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/a/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/a/noImports.kt @@ -1,5 +1,7 @@ package a +import b.test + fun bar() { - b.test() + test() } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/c/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/c/noImports.kt index a62f1daa823..658ae63ed1a 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/c/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/c/noImports.kt @@ -1,5 +1,7 @@ package c +import b.test + fun bar() { - b.test() + test() } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/c/onDemandImport.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/c/onDemandImport.kt index 132915b6a94..faedee2e0ef 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/c/onDemandImport.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/after/c/onDemandImport.kt @@ -1,7 +1,8 @@ package c import a.* +import b.test fun bar() { - b.test() + test() } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/_a/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/_a/noImports.kt index 93d5d1f09de..576a8bd2bee 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/_a/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/_a/noImports.kt @@ -1,5 +1,7 @@ package a +import b.test + fun bar() { - b.test() + test() } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/a/main.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/a/main.kt index f90b20c77b1..38f0bec9dde 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/a/main.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/a/main.kt @@ -1,7 +1,9 @@ package a +import b.test + class Test { fun foo() { - b.test() + test() } } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/a/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/a/noImports.kt index 93d5d1f09de..576a8bd2bee 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/a/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/a/noImports.kt @@ -1,5 +1,7 @@ package a +import b.test + fun bar() { - b.test() + test() } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/c/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/c/noImports.kt index a62f1daa823..658ae63ed1a 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/c/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/c/noImports.kt @@ -1,5 +1,7 @@ package c +import b.test + fun bar() { - b.test() + test() } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/c/onDemandImport.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/c/onDemandImport.kt index 132915b6a94..faedee2e0ef 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/c/onDemandImport.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackage/after/c/onDemandImport.kt @@ -1,7 +1,8 @@ package c import a.* +import b.test fun bar() { - b.test() + test() } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/_a/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/_a/noImports.kt index 1159d9abfef..c7d1ea8ff44 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/_a/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/_a/noImports.kt @@ -1,6 +1,8 @@ package a +import b.test + fun bar() { - b.test = "" - println(b.test) + test = "" + println(test) } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/a/main.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/a/main.kt index f90b20c77b1..38f0bec9dde 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/a/main.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/a/main.kt @@ -1,7 +1,9 @@ package a +import b.test + class Test { fun foo() { - b.test() + test() } } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/a/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/a/noImports.kt index 1159d9abfef..c7d1ea8ff44 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/a/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/a/noImports.kt @@ -1,6 +1,8 @@ package a +import b.test + fun bar() { - b.test = "" - println(b.test) + test = "" + println(test) } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/c/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/c/noImports.kt index 5bfeeb1f712..90955bfba8b 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/c/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/c/noImports.kt @@ -1,6 +1,8 @@ package c +import b.test + fun bar() { - b.test = "" - println(b.test) + test = "" + println(test) } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/c/onDemandImport.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/c/onDemandImport.kt index c1072a9db4b..a51aa659840 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/c/onDemandImport.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/after/c/onDemandImport.kt @@ -1,8 +1,9 @@ package c import a.* +import b.test fun bar() { - b.test = "" - println(b.test) + test = "" + println(test) } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/_a/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/_a/noImports.kt index 1159d9abfef..c7d1ea8ff44 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/_a/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/_a/noImports.kt @@ -1,6 +1,8 @@ package a +import b.test + fun bar() { - b.test = "" - println(b.test) + test = "" + println(test) } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/a/main.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/a/main.kt index f90b20c77b1..38f0bec9dde 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/a/main.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/a/main.kt @@ -1,7 +1,9 @@ package a +import b.test + class Test { fun foo() { - b.test() + test() } } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/a/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/a/noImports.kt index 1159d9abfef..c7d1ea8ff44 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/a/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/a/noImports.kt @@ -1,6 +1,8 @@ package a +import b.test + fun bar() { - b.test = "" - println(b.test) + test = "" + println(test) } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/c/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/c/noImports.kt index 5bfeeb1f712..90955bfba8b 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/c/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/c/noImports.kt @@ -1,6 +1,8 @@ package c +import b.test + fun bar() { - b.test = "" - println(b.test) + test = "" + println(test) } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/c/onDemandImport.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/c/onDemandImport.kt index c1072a9db4b..a51aa659840 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/c/onDemandImport.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToPackage/after/c/onDemandImport.kt @@ -1,8 +1,9 @@ package c import a.* +import b.test fun bar() { - b.test = "" - println(b.test) + test = "" + println(test) } diff --git a/idea/testData/shortenRefs/imports/importGlobalCallables.dependency.kt b/idea/testData/shortenRefs/imports/importGlobalCallables.dependency.kt new file mode 100644 index 00000000000..b7a4a1cc051 --- /dev/null +++ b/idea/testData/shortenRefs/imports/importGlobalCallables.dependency.kt @@ -0,0 +1,4 @@ +package p + +fun globalFun(p: Int) {} +val globalVal: Int = 1 \ No newline at end of file diff --git a/idea/testData/shortenRefs/imports/importGlobalCallables.kt b/idea/testData/shortenRefs/imports/importGlobalCallables.kt new file mode 100644 index 00000000000..57cdcaff7f1 --- /dev/null +++ b/idea/testData/shortenRefs/imports/importGlobalCallables.kt @@ -0,0 +1,3 @@ +fun foo() { + p.globalFun(p.globalVal) +} \ No newline at end of file diff --git a/idea/testData/shortenRefs/imports/importGlobalCallables.kt.after b/idea/testData/shortenRefs/imports/importGlobalCallables.kt.after new file mode 100644 index 00000000000..07572ec3a87 --- /dev/null +++ b/idea/testData/shortenRefs/imports/importGlobalCallables.kt.after @@ -0,0 +1,6 @@ +import p.globalVal +import p.globalFun + +fun foo() { + globalFun(globalVal) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/shortenRefs/ShortenRefsTestGenerated.java b/idea/tests/org/jetbrains/kotlin/shortenRefs/ShortenRefsTestGenerated.java index d14116b2b55..24d704fc1c6 100644 --- a/idea/tests/org/jetbrains/kotlin/shortenRefs/ShortenRefsTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/shortenRefs/ShortenRefsTestGenerated.java @@ -174,6 +174,12 @@ public class ShortenRefsTestGenerated extends AbstractShortenRefsTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/shortenRefs/imports"), Pattern.compile("^([^\\.]+)\\.kt$"), true); } + @TestMetadata("importGlobalCallables.kt") + public void testImportGlobalCallables() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/shortenRefs/imports/importGlobalCallables.kt"); + doTest(fileName); + } + @TestMetadata("leaveQualifiedConstructor.kt") public void testLeaveQualifiedConstructor() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/shortenRefs/imports/leaveQualifiedConstructor.kt");