diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt index 599edb3f364..51d9a8f275d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt @@ -78,7 +78,7 @@ fun PsiReference.matchesTarget(candidateTarget: PsiElement): Boolean { if (candidateTarget !is KtNamedFunction) return false } is KtDestructuringDeclarationReference -> { - if (candidateTarget !is KtNamedFunction && candidateTarget !is KtParameter) return false + if (candidateTarget !is KtNamedFunction && candidateTarget !is KtParameter && candidateTarget !is PsiMethod) return false } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/DestructuringDeclarationReferenceSearcher.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/DestructuringDeclarationReferenceSearcher.kt index 1dcfaa79739..ce56462e080 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/DestructuringDeclarationReferenceSearcher.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/DestructuringDeclarationReferenceSearcher.kt @@ -25,24 +25,16 @@ import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.references.KtDestructuringDeclarationReference import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.resolve.dataClassUtils.getComponentIndex import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance class DestructuringDeclarationReferenceSearcher( targetDeclaration: PsiElement, + private val componentIndex: Int, searchScope: SearchScope, consumer: Processor, optimizer: SearchRequestCollector ) : OperatorReferenceSearcher(targetDeclaration, searchScope, consumer, optimizer, wordsToSearch = listOf("(")) { - //TODO - private val componentIndex = when (targetDeclaration) { - is KtParameter -> targetDeclaration.dataClassComponentFunction()?.name?.asString()?.let { getComponentIndex(it) } - is KtFunction -> targetDeclaration.name?.let { getComponentIndex(it) } - //TODO: java component functions (see KT-13605) - else -> null - } - override fun resolveTargetToDescriptor(): FunctionDescriptor? { if (targetDeclaration is KtParameter) { return targetDeclaration.dataClassComponentFunction() @@ -52,15 +44,10 @@ class DestructuringDeclarationReferenceSearcher( } } - override fun run() { - if (componentIndex == null) return - super.run() - } - override fun extractReference(element: PsiElement): PsiReference? { val destructuringDeclaration = element as? KtDestructuringDeclaration ?: return null val entries = destructuringDeclaration.entries - if (entries.size < componentIndex!!) return null + if (entries.size < componentIndex) return null return entries[componentIndex - 1].references.firstIsInstance() } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/OperatorReferenceSearch.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/OperatorReferenceSearch.kt index 011c3f55f92..7a265ef3f35 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/OperatorReferenceSearch.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/OperatorReferenceSearch.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.idea.util.fuzzyExtensionReceiverType import org.jetbrains.kotlin.idea.util.toFuzzyType import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.resolve.dataClassUtils.getComponentIndex import org.jetbrains.kotlin.resolve.dataClassUtils.isComponentLike import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.types.expressions.OperatorConventions @@ -105,7 +106,8 @@ abstract class OperatorReferenceSearcher( ): OperatorReferenceSearcher<*>? { if (isComponentLike(name)) { if (!options.searchForComponentConventions) return null - return DestructuringDeclarationReferenceSearcher(declaration, searchScope, consumer, optimizer) + val componentIndex = getComponentIndex(name.asString()) + return DestructuringDeclarationReferenceSearcher(declaration, componentIndex, searchScope, consumer, optimizer) } if (!options.searchForOperatorConventions) return null @@ -160,7 +162,7 @@ abstract class OperatorReferenceSearcher( } as? FunctionDescriptor } - open fun run() { + fun run() { val inProgress = SearchesInProgress.get() if (!inProgress.add(targetDeclaration)) return //TODO: it's not quite correct diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.0.java b/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.0.java new file mode 100644 index 00000000000..bb5f34d3d58 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.0.java @@ -0,0 +1,15 @@ +// PSI_ELEMENT: com.intellij.psi.PsiMethod +// OPTIONS: usages + +public class A { +} + +public class JavaClass { + public A component1() { + return new A(); + } + + public int component2() { + return 0; + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.0.kt b/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.0.kt new file mode 100644 index 00000000000..a4f7d9e1fc7 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.0.kt @@ -0,0 +1,3 @@ +fun f(c: JavaClass) { + val (a, n) = c +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.log b/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.log new file mode 100644 index 00000000000..f4ef8af6ea3 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.log @@ -0,0 +1,3 @@ +Resolved (a, n) +Searched references to JavaClass +Searched references to parameter c of f(c: JavaClass) in Kotlin files \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.results.txt b/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.results.txt new file mode 100644 index 00000000000..3997c931a19 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.results.txt @@ -0,0 +1 @@ +Value read 2 val (a, n) = c \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java index 7f5d6f680a2..3bbddbbf8a7 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java @@ -1569,6 +1569,12 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest { doTest(fileName); } + @TestMetadata("javaComponentFunctions.0.java") + public void testJavaComponentFunctions() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/java/findJavaMethodUsages/javaComponentFunctions.0.java"); + doTest(fileName); + } + @TestMetadata("OverriddenMethodSyntheticAccessor.0.java") public void testOverriddenMethodSyntheticAccessor() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/java/findJavaMethodUsages/OverriddenMethodSyntheticAccessor.0.java");