From 849f9fc5c17b14c6a5c3aa2dfa1f008ac01e1a9b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 7 Mar 2018 16:58:10 +0300 Subject: [PATCH] Navigation: add actual declarations as implementations (KT-16892) --- .../KotlinDefinitionsSearcher.kt | 33 ++++++++++++++----- .../multiModule/expectClass/common/common.kt | 1 + .../expectClassFun/common/common.kt | 1 + .../expectClassProperty/common/common.kt | 1 + 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDefinitionsSearcher.kt b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDefinitionsSearcher.kt index 0b048d2ed50..e1c4745462f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDefinitionsSearcher.kt +++ b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDefinitionsSearcher.kt @@ -32,6 +32,8 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.idea.caches.lightClasses.KtFakeLightClass +import org.jetbrains.kotlin.idea.highlighter.markers.actualsForExpected +import org.jetbrains.kotlin.idea.highlighter.markers.isExpectedOrExpectedClassMember import org.jetbrains.kotlin.idea.search.declarationsSearch.forEachImplementation import org.jetbrains.kotlin.idea.search.declarationsSearch.forEachOverridingMethod import org.jetbrains.kotlin.idea.search.declarationsSearch.toPossiblyFakeLightMethods @@ -47,8 +49,9 @@ class KotlinDefinitionsSearcher : QueryExecutor - processClassImplementations(element, consumer) + is KtClass -> { + processClassImplementations(element, consumer) && processActualDeclarations(element, consumer) + } is KtLightClass -> { val useScope = runReadAction { element.useScope } @@ -58,14 +61,21 @@ class KotlinDefinitionsSearcher : QueryExecutor - processFunctionImplementations(element as KtFunction, scope, consumer) + is KtNamedFunction, is KtSecondaryConstructor -> { + processFunctionImplementations(element as KtFunction, scope, consumer) && processActualDeclarations(element, consumer) + } - is KtProperty -> - processPropertyImplementations(element, scope, consumer) + is KtProperty -> { + processPropertyImplementations(element, scope, consumer) && processActualDeclarations(element, consumer) + } - is KtParameter -> - if (isFieldParameter(element)) processPropertyImplementations(element, scope, consumer) else true + is KtParameter -> { + if (isFieldParameter(element)) { + processPropertyImplementations(element, scope, consumer) && processActualDeclarations(element, consumer) + } else { + true + } + } else -> true } @@ -128,6 +138,13 @@ class KotlinDefinitionsSearcher : QueryExecutor): Boolean { + return runReadAction { + if (!declaration.isExpectedOrExpectedClassMember()) true + else declaration.actualsForExpected().all(consumer::process) + } + } + fun processPropertyImplementationsMethods(accessors: Iterable, scope: SearchScope, consumer: Processor): Boolean { return accessors.all { method -> method.forEachOverridingMethod(scope) { implementation -> diff --git a/idea/testData/navigation/implementations/multiModule/expectClass/common/common.kt b/idea/testData/navigation/implementations/multiModule/expectClass/common/common.kt index 92fad937dd6..3356db5a908 100644 --- a/idea/testData/navigation/implementations/multiModule/expectClass/common/common.kt +++ b/idea/testData/navigation/implementations/multiModule/expectClass/common/common.kt @@ -9,4 +9,5 @@ class ExpectedChildChild : ExpectedChild() class SimpleChild : SimpleParent() // REF: [common] (test).ExpectedChildChild +// REF: [jvm] (test).ExpectedChild // REF: [jvm] (test).ExpectedChildChildJvm \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multiModule/expectClassFun/common/common.kt b/idea/testData/navigation/implementations/multiModule/expectClassFun/common/common.kt index 9827b454613..3a27847e0b8 100644 --- a/idea/testData/navigation/implementations/multiModule/expectClassFun/common/common.kt +++ b/idea/testData/navigation/implementations/multiModule/expectClassFun/common/common.kt @@ -17,4 +17,5 @@ class SimpleChild : SimpleParent() { } // REF: [common] (in test.ExpectedChildChild).foo(Int) +// REF: [jvm] (in test.ExpectedChild).foo(Int) // REF: [jvm] (in test.ExpectedChildChildJvm).foo(Int) \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multiModule/expectClassProperty/common/common.kt b/idea/testData/navigation/implementations/multiModule/expectClassProperty/common/common.kt index 32f740e589b..ec02dde4221 100644 --- a/idea/testData/navigation/implementations/multiModule/expectClassProperty/common/common.kt +++ b/idea/testData/navigation/implementations/multiModule/expectClassProperty/common/common.kt @@ -17,4 +17,5 @@ class SimpleChild : SimpleParent() { } // REF: [common] (in test.ExpectedChildChild).bar +// REF: [jvm] (in test.ExpectedChild).bar // REF: [jvm] (in test.ExpectedChildChildJvm).bar \ No newline at end of file