From 696f382291b9b6ae569db4d1f8dd66d16d005d9e Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 25 Aug 2016 21:23:56 +0300 Subject: [PATCH] Supported usages as destructuring declaration for other class --- .../destructuringDeclarationUsages.kt | 19 ++++++++++++++++--- .../conventions/components/dataClass.0.java | 2 +- .../conventions/components/dataClass.2.kt | 2 +- .../conventions/components/dataClass.3.kt | 16 ++++++++++++++++ .../components/dataClass.results.txt | 4 +++- 5 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 idea/testData/findUsages/kotlin/conventions/components/dataClass.3.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/destructuringDeclarationUsages.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/destructuringDeclarationUsages.kt index 3ca6ebfa80d..493b443204b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/destructuringDeclarationUsages.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/destructuringDeclarationUsages.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.idea.util.fuzzyExtensionReceiverType import org.jetbrains.kotlin.idea.util.toFuzzyType import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.resolve.dataClassUtils.getComponentIndex import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.util.isValidOperator @@ -278,7 +279,21 @@ private class Processor( //TODO: what about Scala and other JVM-languages? val declarationUsageScope = GlobalSearchScope.projectScope(declaration.project).restrictToKotlinSources() ReferencesSearch.search(declaration, declarationUsageScope).forEach { reference -> - (reference.element as? KtReferenceExpression)?.let { processSuspiciousExpression(it) } + if (reference is KtDestructuringDeclarationReference) { // declaration usage in form of destructuring declaration + val entries = reference.element.entries + val componentIndex = when (declaration) { + is KtParameter -> declaration.dataClassComponentFunction()?.name?.asString()?.let { getComponentIndex(it) } + is KtFunction -> declaration.name?.let { getComponentIndex(it) } + //TODO: java component functions (see KT-13605) + else -> null + } + if (componentIndex != null && componentIndex <= entries.size) { + processDeclarationOfTypeWithDataClass(entries[componentIndex - 1]) + } + } + else { + (reference.element as? KtReferenceExpression)?.let { processSuspiciousExpression(it) } + } } } @@ -313,8 +328,6 @@ private class Processor( } } } - - //TODO: entry of data type } } } diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.0.java b/idea/testData/findUsages/kotlin/conventions/components/dataClass.0.java index e103eb2d200..89b2fc5befb 100644 --- a/idea/testData/findUsages/kotlin/conventions/components/dataClass.0.java +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.0.java @@ -8,4 +8,4 @@ class JavaClass { } public void takeA(A a){} -} \ No newline at end of file +} diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.2.kt b/idea/testData/findUsages/kotlin/conventions/components/dataClass.2.kt index 7cd92d6ccfe..446eaa5c8f7 100644 --- a/idea/testData/findUsages/kotlin/conventions/components/dataClass.2.kt +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.2.kt @@ -1,6 +1,6 @@ import pack.A -fun test(javaClass: JavaClass) { +fun test(javaClass: JavaClass, javaClass2: JavaClass2) { val a = A(1, "2", Any()) a.n a.component1() diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.3.kt b/idea/testData/findUsages/kotlin/conventions/components/dataClass.3.kt new file mode 100644 index 00000000000..d8da6cfa35f --- /dev/null +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.3.kt @@ -0,0 +1,16 @@ +package pack + +data class B(val a: A, val n: Int) + +class C { + operator fun component1(): A = TODO() + operator fun component2() = 0 +} + +fun f(b: B, c: C) { + val (a, n) = b + val (x, y, z) = a + + val (a1, n1) = c + val (x1, y1, z1) = a1 +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt b/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt index fd8d50ff9a7..660529abf60 100644 --- a/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt @@ -12,4 +12,6 @@ [dataClass.2.kt] Value read 33 val (x, y) = list[0] [dataClass.2.kt] Value read 5 a.n [dataClass.2.kt] Value read 8 val (x, y, z) = a -[dataClass.2.kt] Value read 9 val (x1, y1, z1) = f() \ No newline at end of file +[dataClass.2.kt] Value read 9 val (x1, y1, z1) = f() +[dataClass.3.kt] Value read 12 val (x, y, z) = a +[dataClass.3.kt] Value read 15 val (x1, y1, z1) = a1 \ No newline at end of file