From 4b3cf432dc91e9bf6ac98a317da7542dfd00c44e Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Thu, 12 Jan 2017 16:31:23 +0300 Subject: [PATCH] KT-5629 Quickfix to import extension method when arguments of non-extension method do not match #KT-5629 fixed --- .../kotlin/idea/quickfix/ImportFix.kt | 4 +++- .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 1 + ...ApplicableFromInstanceButExtension.after.kt | 10 ++++++++++ ...omInstanceButExtension.before.Dependency.kt | 18 ++++++++++++++++++ ...ableFromInstanceButExtension.before.Main.kt | 9 +++++++++ .../QuickFixMultiFileTestGenerated.java | 6 ++++++ 6 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.after.kt create mode 100644 idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.before.Dependency.kt create mode 100644 idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.before.Main.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt index 60e0d7df4ff..d6c5d29b1bf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.getResolveScope import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde +import org.jetbrains.kotlin.idea.codeInsight.referenceExpression import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport @@ -483,7 +484,8 @@ internal class ImportForMismatchingArgumentsFix( return callExpression.valueArguments + callExpression.valueArguments.mapNotNull { it.getArgumentExpression() } + callExpression.valueArguments.mapNotNull { it.getArgumentName()?.referenceExpression } + - callExpression.valueArgumentList.singletonOrEmptyList() + callExpression.valueArgumentList.singletonOrEmptyList() + + callExpression.referenceExpression().singletonOrEmptyList() } override fun fillCandidates( diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 6fccc62ec84..8ab980ba6a2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -147,6 +147,7 @@ class QuickFixRegistrar : QuickFixContributor { TYPE_MISMATCH.registerFactory(ImportForMismatchingArgumentsFix) CONSTANT_EXPECTED_TYPE_MISMATCH.registerFactory(ImportForMismatchingArgumentsFix) NAMED_PARAMETER_NOT_FOUND.registerFactory(ImportForMismatchingArgumentsFix) + NONE_APPLICABLE.registerFactory(ImportForMismatchingArgumentsFix) UNRESOLVED_REFERENCE.registerFactory(AddTestLibQuickFix) diff --git a/idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.after.kt b/idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.after.kt new file mode 100644 index 00000000000..03003b92fa4 --- /dev/null +++ b/idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.after.kt @@ -0,0 +1,10 @@ +// "Import" "true" +// ERROR: None of the following functions can be called with the arguments supplied:
public final fun buz(i: Int, l: Int): Unit defined in lib.Bar
public final fun buz(i: Int, m: M): Unit defined in lib.Bar +import lib.Bar +import lib.buz + +fun useSite() { + + val bar = Bar() + bar.buz("1", "2") +} \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.before.Dependency.kt b/idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.before.Dependency.kt new file mode 100644 index 00000000000..23ce86eddb6 --- /dev/null +++ b/idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.before.Dependency.kt @@ -0,0 +1,18 @@ +package lib + +class M + +class Bar { + fun buz(i: Int, m: M) { + + } + + fun buz(i: Int, l: Int) { + + } +} + + +fun Bar.buz(s: String, i: String) { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.before.Main.kt b/idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.before.Main.kt new file mode 100644 index 00000000000..fd633c2e18d --- /dev/null +++ b/idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.before.Main.kt @@ -0,0 +1,9 @@ +// "Import" "true" +// ERROR: None of the following functions can be called with the arguments supplied:
public final fun buz(i: Int, l: Int): Unit defined in lib.Bar
public final fun buz(i: Int, m: M): Unit defined in lib.Bar +import lib.Bar + +fun useSite() { + + val bar = Bar() + bar.buz("1", "2") +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index 9995b7d1db8..3f274ed364e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -510,6 +510,12 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes doTestWithExtraFile(fileName); } + @TestMetadata("noneApplicableFromInstanceButExtension.before.Main.kt") + public void testNoneApplicableFromInstanceButExtension() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/noneApplicableFromInstanceButExtension.before.Main.kt"); + doTestWithExtraFile(fileName); + } + @TestMetadata("notExcludedClass.before.Main.kt") public void testNotExcludedClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/notExcludedClass.before.Main.kt");