diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ShortenReferences.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ShortenReferences.kt index 2604fec72d4..3c382cfa455 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ShortenReferences.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ShortenReferences.kt @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier import org.jetbrains.kotlin.resolve.scopes.utils.findPackage +import org.jetbrains.kotlin.utils.singletonOrEmptyList import java.util.* class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT }) { @@ -210,12 +211,12 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT protected fun analyze(element: KtElement) = resolutionFacade.analyze(element, BodyResolveMode.PARTIAL) - protected fun processQualifiedElement(element: T, target: DeclarationDescriptor?, canShortenNow: Boolean) { + protected fun processQualifiedElement(element: T, targets: Collection, canShortenNow: Boolean) { if (canShortenNow) { addElementToShorten(element) } - else if (target != null && target !in failedToImportDescriptors && mayImport(target, file)) { - descriptorsToImport.add(target) + else if (targets.isNotEmpty() && targets.none { it in failedToImportDescriptors } && targets.all { mayImport(it, file) }) { + descriptorsToImport.addAll(targets) } else { qualifier(element).accept(this) @@ -283,14 +284,14 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT val target = referenceExpression.targets(bindingContext).singleOrNull() ?: return val scope = type.getResolutionScope(bindingContext, resolutionFacade) - val name = target.getName() + val name = target.name val targetByName = if (target is ClassifierDescriptor) scope.findClassifier(name, NoLookupLocation.FROM_IDE) else scope.findPackage(name) val canShortenNow = targetByName?.asString() == target.asString() - processQualifiedElement(type, target, canShortenNow) + processQualifiedElement(type, target.singletonOrEmptyList(), canShortenNow) } override fun qualifier(element: KtUserType) = element.qualifier!! @@ -378,7 +379,7 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT return false } - processQualifiedElement(qualifiedExpression, targets.singleOrNull(), targetsMatch) + processQualifiedElement(qualifiedExpression, targets, targetsMatch) return true } diff --git a/idea/testData/copyPaste/imports/UnresolvedOverload.dependency.kt b/idea/testData/copyPaste/imports/UnresolvedOverload.dependency.kt new file mode 100644 index 00000000000..d95ae93992d --- /dev/null +++ b/idea/testData/copyPaste/imports/UnresolvedOverload.dependency.kt @@ -0,0 +1,4 @@ +package a.b.c.d + +fun foo(p: Int) {} +fun foo(p: String) {} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/UnresolvedOverload.expected.kt b/idea/testData/copyPaste/imports/UnresolvedOverload.expected.kt new file mode 100644 index 00000000000..65c0ec86954 --- /dev/null +++ b/idea/testData/copyPaste/imports/UnresolvedOverload.expected.kt @@ -0,0 +1,6 @@ +// ERROR: Unresolved reference: p +import a.b.c.d.foo + +fun g() { + foo(p) +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/UnresolvedOverload.expected.names b/idea/testData/copyPaste/imports/UnresolvedOverload.expected.names new file mode 100644 index 00000000000..e2b2a713ba5 --- /dev/null +++ b/idea/testData/copyPaste/imports/UnresolvedOverload.expected.names @@ -0,0 +1 @@ +a.b.c.d.foo \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/UnresolvedOverload.kt b/idea/testData/copyPaste/imports/UnresolvedOverload.kt new file mode 100644 index 00000000000..5a7af332c40 --- /dev/null +++ b/idea/testData/copyPaste/imports/UnresolvedOverload.kt @@ -0,0 +1,5 @@ +import a.b.c.d.foo + +fun f(p: Int) { + foo(p) +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/UnresolvedOverload.to.kt b/idea/testData/copyPaste/imports/UnresolvedOverload.to.kt new file mode 100644 index 00000000000..b1d2df062b1 --- /dev/null +++ b/idea/testData/copyPaste/imports/UnresolvedOverload.to.kt @@ -0,0 +1,3 @@ +fun g() { + +} \ No newline at end of file diff --git a/idea/testData/shortenRefs/UnresolvedOverload.dependency.kt b/idea/testData/shortenRefs/UnresolvedOverload.dependency.kt new file mode 100644 index 00000000000..8b273777901 --- /dev/null +++ b/idea/testData/shortenRefs/UnresolvedOverload.dependency.kt @@ -0,0 +1,6 @@ +package a.b.c + +class Foo(p: Int) + +fun Foo(s: String){} +fun Foo(c: Char){} \ No newline at end of file diff --git a/idea/testData/shortenRefs/UnresolvedOverload.kt b/idea/testData/shortenRefs/UnresolvedOverload.kt new file mode 100644 index 00000000000..4df31e0a154 --- /dev/null +++ b/idea/testData/shortenRefs/UnresolvedOverload.kt @@ -0,0 +1,3 @@ +fun foo() { + a.b.c.Foo(1.0) +} \ No newline at end of file diff --git a/idea/testData/shortenRefs/UnresolvedOverload.kt.after b/idea/testData/shortenRefs/UnresolvedOverload.kt.after new file mode 100644 index 00000000000..82a891e9964 --- /dev/null +++ b/idea/testData/shortenRefs/UnresolvedOverload.kt.after @@ -0,0 +1,5 @@ +import a.b.c.Foo + +fun foo() { + Foo(1.0) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java index a11e6921e62..9095149c809 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java @@ -378,6 +378,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/imports/TypeParameter.kt"); doTestCopy(fileName); } + + @TestMetadata("UnresolvedOverload.kt") + public void testUnresolvedOverload() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/imports/UnresolvedOverload.kt"); + doTestCopy(fileName); + } } @TestMetadata("idea/testData/copyPaste/imports") @@ -729,5 +735,11 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/imports/TypeParameter.kt"); doTestCut(fileName); } + + @TestMetadata("UnresolvedOverload.kt") + public void testUnresolvedOverload() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/imports/UnresolvedOverload.kt"); + doTestCut(fileName); + } } } diff --git a/idea/tests/org/jetbrains/kotlin/shortenRefs/ShortenRefsTestGenerated.java b/idea/tests/org/jetbrains/kotlin/shortenRefs/ShortenRefsTestGenerated.java index 6ecc4cbd5dc..f7976231fe8 100644 --- a/idea/tests/org/jetbrains/kotlin/shortenRefs/ShortenRefsTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/shortenRefs/ShortenRefsTestGenerated.java @@ -101,6 +101,12 @@ public class ShortenRefsTestGenerated extends AbstractShortenRefsTest { doTest(fileName); } + @TestMetadata("UnresolvedOverload.kt") + public void testUnresolvedOverload() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/shortenRefs/UnresolvedOverload.kt"); + doTest(fileName); + } + @TestMetadata("idea/testData/shortenRefs/constructor") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)