From 1b8205273baf6600c135fb73763e0b5d223866cb Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 7 Nov 2013 17:27:41 +0400 Subject: [PATCH] Search constructor-declared properties together with class declarations --- .../jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt | 14 +++++++++++++- .../plugin/search/usagesSearch/searchHelpers.kt | 5 +++-- .../kotlinClassPropertyUsages2.0.kt | 2 +- .../kotlinClassPropertyUsages2.1.kt | 2 ++ .../kotlinClassPropertyUsages2.results.txt | 5 ++++- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt index 2da1f45892d..ee49c5e0244 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt @@ -19,6 +19,10 @@ package org.jetbrains.jet.lang.psi.psiUtil import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.jet.lang.psi.JetDeclaration +import org.jetbrains.jet.lang.psi.JetClass +import java.util.ArrayList +import org.jetbrains.jet.lang.psi.JetClassOrObject fun PsiElement.getParentByTypeAndPredicate( parentClass : Class, strict : Boolean = false, predicate: (T) -> Boolean @@ -54,4 +58,12 @@ fun T.getIfChildIsInBranch(element: PsiElement, branch: T.() -> fun PsiElement.getParentByTypeAndBranch( parentClass : Class, strict : Boolean = false, branch: T.() -> PsiElement?) : T? { return getParentByType(parentClass, strict)?.getIfChildIsInBranch(this, branch) -} \ No newline at end of file +} + +fun JetClassOrObject.effectiveDeclarations(): List = + when(this) { + is JetClass -> + getDeclarations() + getPrimaryConstructorParameters().filter { p -> p.getValOrVarNode() != null } + else -> + getDeclarations() + } \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/search/usagesSearch/searchHelpers.kt b/idea/src/org/jetbrains/jet/plugin/search/usagesSearch/searchHelpers.kt index 9d9eca3356d..52d2f44bf0d 100644 --- a/idea/src/org/jetbrains/jet/plugin/search/usagesSearch/searchHelpers.kt +++ b/idea/src/org/jetbrains/jet/plugin/search/usagesSearch/searchHelpers.kt @@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.psi.JetParameter import org.jetbrains.jet.lang.psi.JetPsiUtil import org.jetbrains.jet.lang.psi.psiUtil.* import org.jetbrains.jet.asJava.LightClassUtil.PropertyAccessorsPsiMethods +import org.jetbrains.jet.lang.psi.psiUtil.* val isTargetUsage = (PsiReference::isTargetUsage).searchFilter @@ -136,8 +137,8 @@ class ClassDeclarationsUsagesSearchHelper( val items = ArrayList() val declHelper = DefaultSearchHelper(skipImports) - for (decl in target.element.getDeclarations()) { - if ((decl is JetNamedFunction && functionUsages) || (decl is JetProperty && propertyUsages)) { + for (decl in target.element.effectiveDeclarations()) { + if ((decl is JetNamedFunction && functionUsages) || ((decl is JetProperty || decl is JetParameter) && propertyUsages)) { items.add(declHelper.newItem(target.retarget(decl as JetNamedDeclaration))) } } diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.0.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.0.kt index 2f67a46fa1e..02b0cdcc736 100644 --- a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.0.kt +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.0.kt @@ -18,7 +18,7 @@ trait X { } } -open class A: X { +open class A(val t: String, var u: String): X { override val a: String get() { return "?" diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.1.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.1.kt index b5110588bcb..e7722f40367 100644 --- a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.1.kt +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.1.kt @@ -2,7 +2,9 @@ class Usages { fun foo(a: A) { a.foo("") println("${a.a} ${a.b}") + println("${a.t} ${a.u}") a.b = 12 + a.u = 13 } fun foo(x: X) { diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.results.txt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.results.txt index 7c5d6c62d1f..0dc835e5a88 100644 --- a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.results.txt +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassPropertyUsages2.results.txt @@ -1,3 +1,6 @@ Value read (4: 22) println("${a.a} ${a.b}") Value read (4: 29) println("${a.a} ${a.b}") -Value write (5: 11) a.b = 12 +Value read (5: 22) println("${a.t} ${a.u}") +Value read (5: 29) println("${a.t} ${a.u}") +Value write (6: 11) a.b = 12 +Value write (7: 11) a.u = 13 \ No newline at end of file