From 9ca963f886c9dd679699de2967d4ee2ec9f7dc20 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 15 May 2024 13:10:39 +0200 Subject: [PATCH] [kotlin] kmp find usages: implicit component usages KtDestructuringDeclarationReference has component as second target, thus we need to check all of them ^KTIJ-29947 fixed GitOrigin-RevId: a743a6453bc55f2051ebbfdc4a67e7c00202f91f --- .../operators/OperatorReferenceSearcher.kt | 5 +++-- .../FindUsagesMultiModuleFirTestGenerated.java | 10 ++++++++++ .../findUsages/FindUsagesMultiModuleTestGenerated.java | 10 ++++++++++ .../common/common.kt | 9 +++++++++ .../common/common.results.txt | 6 ++++++ .../findComponentsByConventionInCommon/directives.txt | 1 + .../findComponentsByConventionInCommon/js/js.kt | 6 ++++++ .../findComponentsByConventionInCommon/jvm/jvm.kt | 6 ++++++ .../common/common.kt | 7 +++++++ .../directives.txt | 1 + .../findComponentsByConventionInPlatform/js/js.kt | 8 ++++++++ .../js/js.results.txt | 6 ++++++ .../findComponentsByConventionInPlatform/jvm/jvm.kt | 6 ++++++ 13 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/common/common.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/common/common.results.txt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/directives.txt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/js/js.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/jvm/jvm.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/common/common.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/directives.txt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/js/js.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/js/js.results.txt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/jvm/jvm.kt diff --git a/plugins/kotlin/base/analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/operators/OperatorReferenceSearcher.kt b/plugins/kotlin/base/analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/operators/OperatorReferenceSearcher.kt index fff3210b2745..3f4346e6d175 100644 --- a/plugins/kotlin/base/analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/operators/OperatorReferenceSearcher.kt +++ b/plugins/kotlin/base/analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/operators/OperatorReferenceSearcher.kt @@ -67,9 +67,10 @@ abstract class OperatorReferenceSearcher( return consumer.process(reference) } - val currentTarget = reference.resolve() as? KtDeclaration ?: return true + val currentTargets = (reference as? PsiPolyVariantReference)?.multiResolve(false)?.mapNotNull { it.element as? KtDeclaration } ?: return true if (targetDeclaration !is KtDeclaration) return true - return if ((targetDeclaration.expectedDeclarationIfAny() ?: targetDeclaration) == (currentTarget.expectedDeclarationIfAny() ?: currentTarget) + val expectedTarget = targetDeclaration.expectedDeclarationIfAny() ?: targetDeclaration + return if (expectedTarget in currentTargets.map { it.expectedDeclarationIfAny() ?: it } ) { consumer.process(reference) } else { diff --git a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/findUsages/FindUsagesMultiModuleFirTestGenerated.java b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/findUsages/FindUsagesMultiModuleFirTestGenerated.java index 3deae8f70c47..c77d788cafe1 100644 --- a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/findUsages/FindUsagesMultiModuleFirTestGenerated.java +++ b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/findUsages/FindUsagesMultiModuleFirTestGenerated.java @@ -73,6 +73,16 @@ public class FindUsagesMultiModuleFirTestGenerated extends AbstractFindUsagesMul runTest("../../idea/tests/testData/multiModuleFindUsages/findCompanionObjectUsages/"); } + @TestMetadata("findComponentsByConventionInCommon") + public void testFindComponentsByConventionInCommon() throws Exception { + runTest("../../idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/"); + } + + @TestMetadata("findComponentsByConventionInPlatform") + public void testFindComponentsByConventionInPlatform() throws Exception { + runTest("../../idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/"); + } + @TestMetadata("findDataComponentInJs") public void testFindDataComponentInJs() throws Exception { runTest("../../idea/tests/testData/multiModuleFindUsages/findDataComponentInJs/"); diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/findUsages/FindUsagesMultiModuleTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/findUsages/FindUsagesMultiModuleTestGenerated.java index 407c723ec59a..d132525f50c0 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/findUsages/FindUsagesMultiModuleTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/findUsages/FindUsagesMultiModuleTestGenerated.java @@ -73,6 +73,16 @@ public class FindUsagesMultiModuleTestGenerated extends AbstractFindUsagesMultiM runTest("testData/multiModuleFindUsages/findCompanionObjectUsages/"); } + @TestMetadata("findComponentsByConventionInCommon") + public void testFindComponentsByConventionInCommon() throws Exception { + runTest("testData/multiModuleFindUsages/findComponentsByConventionInCommon/"); + } + + @TestMetadata("findComponentsByConventionInPlatform") + public void testFindComponentsByConventionInPlatform() throws Exception { + runTest("testData/multiModuleFindUsages/findComponentsByConventionInPlatform/"); + } + @TestMetadata("findDataComponentInJs") public void testFindDataComponentInJs() throws Exception { runTest("testData/multiModuleFindUsages/findDataComponentInJs/"); diff --git a/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/common/common.kt b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/common/common.kt new file mode 100644 index 000000000000..f5cca9650108 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/common/common.kt @@ -0,0 +1,9 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtFunction +// OPTIONS: usages, expected +class DummyClass001 +expect operator fun DummyClass001.component1() +expect operator fun DummyClass001.component2() +fun testDummyClass001() { + val (a, b) = DummyClass001() + DummyClass001().component1() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/common/common.results.txt b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/common/common.results.txt new file mode 100644 index 000000000000..3f7ce0b56d0a --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/common/common.results.txt @@ -0,0 +1,6 @@ +[common.kt] Function call 8 DummyClass001().component1() +[common.kt] Value read 7 val (a, b) = DummyClass001() +[js.kt] Function call 5 DummyClass001().component1() +[js.kt] Value read 4 val (a, b) = DummyClass001() +[jvm.kt] Function call 5 DummyClass001().component1() +[jvm.kt] Value read 4 val (a, b) = DummyClass001() \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/directives.txt b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/directives.txt new file mode 100644 index 000000000000..a8106f330558 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/directives.txt @@ -0,0 +1 @@ +// IGNORE_K1 diff --git a/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/js/js.kt b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/js/js.kt new file mode 100644 index 000000000000..a75d057498ac --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/js/js.kt @@ -0,0 +1,6 @@ +actual operator fun DummyClass001.component1() {} +actual operator fun DummyClass001.component2() {} +fun testDummyClass001Js() { + val (a, b) = DummyClass001() + DummyClass001().component1() +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/jvm/jvm.kt b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/jvm/jvm.kt new file mode 100644 index 000000000000..5a224d97bc5b --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInCommon/jvm/jvm.kt @@ -0,0 +1,6 @@ +actual operator fun DummyClass001.component1() {} +actual operator fun DummyClass001.component2() {} +fun testDummyClass001Jvm() { + val (a, b) = DummyClass001() + DummyClass001().component1() +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/common/common.kt b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/common/common.kt new file mode 100644 index 000000000000..dcf4d01347d8 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/common/common.kt @@ -0,0 +1,7 @@ +class DummyClass001 +expect operator fun DummyClass001.component1() +expect operator fun DummyClass001.component2() +fun testDummyClass001() { + val (a, b) = DummyClass001() + DummyClass001().component1() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/directives.txt b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/directives.txt new file mode 100644 index 000000000000..a8106f330558 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/directives.txt @@ -0,0 +1 @@ +// IGNORE_K1 diff --git a/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/js/js.kt b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/js/js.kt new file mode 100644 index 000000000000..716da0420268 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/js/js.kt @@ -0,0 +1,8 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtFunction +// OPTIONS: usages, expected +actual operator fun DummyClass001.component1() {} +actual operator fun DummyClass001.component2() {} +fun testDummyClass001Js() { + val (a, b) = DummyClass001() + DummyClass001().component1() +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/js/js.results.txt b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/js/js.results.txt new file mode 100644 index 000000000000..304917f9983a --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/js/js.results.txt @@ -0,0 +1,6 @@ +[common.kt] Function call 6 DummyClass001().component1() +[common.kt] Value read 5 val (a, b) = DummyClass001() +[js.kt] Function call 7 DummyClass001().component1() +[js.kt] Value read 6 val (a, b) = DummyClass001() +[jvm.kt] Function call 5 DummyClass001().component1() +[jvm.kt] Value read 4 val (a, b) = DummyClass001() \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/jvm/jvm.kt b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/jvm/jvm.kt new file mode 100644 index 000000000000..5a224d97bc5b --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleFindUsages/findComponentsByConventionInPlatform/jvm/jvm.kt @@ -0,0 +1,6 @@ +actual operator fun DummyClass001.component1() {} +actual operator fun DummyClass001.component2() {} +fun testDummyClass001Jvm() { + val (a, b) = DummyClass001() + DummyClass001().component1() +}