diff --git a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/imports/UsedReference.kt b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/imports/UsedReference.kt index db78acfd0003..918eb753d1b4 100644 --- a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/imports/UsedReference.kt +++ b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/imports/UsedReference.kt @@ -47,6 +47,14 @@ internal class UsedReference private constructor(val reference: KtReference) { get() = reference.resolvesByNames fun KaSession.isResolved(): Boolean { + if (reference is KtInvokeFunctionReference) { + // invoke references on Kotlin builtin functional types (like `() -> Unit`) + // always have empty `resolveToSymbols`, so we have to do the check another way + val callInfo = reference.element.resolveToCall() ?: return false + + return callInfo.calls.isNotEmpty() + } + val resolvedSymbols = reference.resolveToSymbols() return resolvedSymbols.isNotEmpty() diff --git a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/imports/FirJvmOptimizeImportsTestGenerated.java b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/imports/FirJvmOptimizeImportsTestGenerated.java index 524830c5fa58..a0b8700931b3 100644 --- a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/imports/FirJvmOptimizeImportsTestGenerated.java +++ b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/imports/FirJvmOptimizeImportsTestGenerated.java @@ -669,6 +669,11 @@ public abstract class FirJvmOptimizeImportsTestGenerated extends AbstractFirJvmO runTest("../../idea/tests/testData/editor/optimizeImports/common/InvokeFunctionCallWithOverloadAmbiguity_literalReceiver.kt"); } + @TestMetadata("InvokeOnFunctionalTypeVsUnusedInvokeImport.kt") + public void testInvokeOnFunctionalTypeVsUnusedInvokeImport() throws Exception { + runTest("../../idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt"); + } + @TestMetadata("IteratorFunction.kt") public void testIteratorFunction() throws Exception { runTest("../../idea/tests/testData/editor/optimizeImports/common/IteratorFunction.kt"); diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JsOptimizeImportsTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JsOptimizeImportsTestGenerated.java index f142e49401b3..f1e29e332a5c 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JsOptimizeImportsTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JsOptimizeImportsTestGenerated.java @@ -406,6 +406,11 @@ public abstract class JsOptimizeImportsTestGenerated extends AbstractJsOptimizeI runTest("testData/editor/optimizeImports/common/InvokeFunctionCallWithOverloadAmbiguity_literalReceiver.kt"); } + @TestMetadata("InvokeOnFunctionalTypeVsUnusedInvokeImport.kt") + public void testInvokeOnFunctionalTypeVsUnusedInvokeImport() throws Exception { + runTest("testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt"); + } + @TestMetadata("IteratorFunction.kt") public void testIteratorFunction() throws Exception { runTest("testData/editor/optimizeImports/common/IteratorFunction.kt"); diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java index 6acc35050246..42f530babb4d 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java @@ -674,6 +674,11 @@ public abstract class JvmOptimizeImportsTestGenerated extends AbstractJvmOptimiz runTest("testData/editor/optimizeImports/common/InvokeFunctionCallWithOverloadAmbiguity_literalReceiver.kt"); } + @TestMetadata("InvokeOnFunctionalTypeVsUnusedInvokeImport.kt") + public void testInvokeOnFunctionalTypeVsUnusedInvokeImport() throws Exception { + runTest("testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt"); + } + @TestMetadata("IteratorFunction.kt") public void testIteratorFunction() throws Exception { runTest("testData/editor/optimizeImports/common/IteratorFunction.kt"); diff --git a/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.dependency.kt b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.dependency.kt new file mode 100644 index 000000000000..bc1dbe1f03c4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.dependency.kt @@ -0,0 +1,3 @@ +package dependency + +fun invoke() {} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt new file mode 100644 index 000000000000..ec3c9db7d1cd --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt @@ -0,0 +1,7 @@ +package test + +import dependency.invoke + +fun test(action: () -> Unit) { + action() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt.after b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt.after new file mode 100644 index 000000000000..66b163fdcddd --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt.after @@ -0,0 +1,5 @@ +package test + +fun test(action: () -> Unit) { + action() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt.log b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt.log new file mode 100644 index 000000000000..2606b959df60 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/common/InvokeOnFunctionalTypeVsUnusedInvokeImport.kt.log @@ -0,0 +1 @@ +Additional checking of reference KtInvokeFunctionReference: action()