From 0fb8dd2f7575f8274816194854bace7a9b67d08b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 8 Aug 2018 15:31:43 +0300 Subject: [PATCH] Handle constructor usage for actual class as usage of expect class #KT-25498 Fixed --- .../jetbrains/kotlin/idea/references/referenceUtil.kt | 9 ++++++--- .../findActualInterface/common/common.kt | 2 ++ .../findActualInterface/jvm/jvm.kt | 5 +++++ .../findActualInterface/jvm/jvm.results.txt | 2 ++ .../findCommonSuperclass/common/common.kt | 5 +++++ .../findCommonSuperclass/common/common.results.txt | 2 ++ .../findCommonSuperclass/jvm/jvm.kt | 2 ++ .../kotlin/findUsages/FindUsagesMultiModuleTest.kt | 10 ++++++++++ 8 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 idea/testData/multiModuleFindUsages/findActualInterface/common/common.kt create mode 100644 idea/testData/multiModuleFindUsages/findActualInterface/jvm/jvm.kt create mode 100644 idea/testData/multiModuleFindUsages/findActualInterface/jvm/jvm.results.txt create mode 100644 idea/testData/multiModuleFindUsages/findCommonSuperclass/common/common.kt create mode 100644 idea/testData/multiModuleFindUsages/findCommonSuperclass/common/common.results.txt create mode 100644 idea/testData/multiModuleFindUsages/findCommonSuperclass/jvm/jvm.kt 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 9188f319dff..2ddc12b704d 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 @@ -181,10 +181,13 @@ fun KtSimpleNameReference.canBePsiMethodReference(): Boolean { } private fun PsiElement.isConstructorOf(unwrappedCandidate: PsiElement) = - // call to Java constructor - (this is PsiMethod && isConstructor && containingClass == unwrappedCandidate) || + when { + // call to Java constructor + this is PsiMethod && isConstructor && containingClass == unwrappedCandidate -> true // call to Kotlin constructor - (this is KtConstructor<*> && getContainingClassOrObject() == unwrappedCandidate) + this is KtConstructor<*> && getContainingClassOrObject().isEquivalentTo(unwrappedCandidate) -> true + else -> false + } fun AbstractKtReference.renameImplicitConventionalCall(newName: String?): KtExpression { if (newName == null) return expression diff --git a/idea/testData/multiModuleFindUsages/findActualInterface/common/common.kt b/idea/testData/multiModuleFindUsages/findActualInterface/common/common.kt new file mode 100644 index 00000000000..d5d2f85f120 --- /dev/null +++ b/idea/testData/multiModuleFindUsages/findActualInterface/common/common.kt @@ -0,0 +1,2 @@ +expect interface I +expect class C : I \ No newline at end of file diff --git a/idea/testData/multiModuleFindUsages/findActualInterface/jvm/jvm.kt b/idea/testData/multiModuleFindUsages/findActualInterface/jvm/jvm.kt new file mode 100644 index 00000000000..4d984c8af6c --- /dev/null +++ b/idea/testData/multiModuleFindUsages/findActualInterface/jvm/jvm.kt @@ -0,0 +1,5 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtClass +// OPTIONS: usages, expected + +actual interface I +actual class C : I diff --git a/idea/testData/multiModuleFindUsages/findActualInterface/jvm/jvm.results.txt b/idea/testData/multiModuleFindUsages/findActualInterface/jvm/jvm.results.txt new file mode 100644 index 00000000000..831370b031d --- /dev/null +++ b/idea/testData/multiModuleFindUsages/findActualInterface/jvm/jvm.results.txt @@ -0,0 +1,2 @@ +[common.kt] Supertype 2 expect class C : I +[jvm.kt] Supertype 5 actual class C : I \ No newline at end of file diff --git a/idea/testData/multiModuleFindUsages/findCommonSuperclass/common/common.kt b/idea/testData/multiModuleFindUsages/findCommonSuperclass/common/common.kt new file mode 100644 index 00000000000..96b54600db5 --- /dev/null +++ b/idea/testData/multiModuleFindUsages/findCommonSuperclass/common/common.kt @@ -0,0 +1,5 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtClass +// OPTIONS: usages, expected + +expect open class OClass(i: Int) +expect class Inheritor : OClass \ No newline at end of file diff --git a/idea/testData/multiModuleFindUsages/findCommonSuperclass/common/common.results.txt b/idea/testData/multiModuleFindUsages/findCommonSuperclass/common/common.results.txt new file mode 100644 index 00000000000..1207989a7f6 --- /dev/null +++ b/idea/testData/multiModuleFindUsages/findCommonSuperclass/common/common.results.txt @@ -0,0 +1,2 @@ +[common.kt] Supertype 5 expect class Inheritor : OClass +[jvm.kt] Supertype 2 actual class Inheritor : OClass(42) \ No newline at end of file diff --git a/idea/testData/multiModuleFindUsages/findCommonSuperclass/jvm/jvm.kt b/idea/testData/multiModuleFindUsages/findCommonSuperclass/jvm/jvm.kt new file mode 100644 index 00000000000..41065cfb412 --- /dev/null +++ b/idea/testData/multiModuleFindUsages/findCommonSuperclass/jvm/jvm.kt @@ -0,0 +1,2 @@ +actual open class OClass actual constructor(i: Int) +actual class Inheritor : OClass(42) diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesMultiModuleTest.kt index c3cf63ae968..7f930e63b8f 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesMultiModuleTest.kt @@ -22,6 +22,11 @@ import java.io.File class FindUsagesMultiModuleTest : AbstractFindUsagesMultiModuleTest() { + @Test + fun testFindActualInterface() { + doTest() + } + @Test fun testFindCommonClassFromActual() { doTest() @@ -37,6 +42,11 @@ class FindUsagesMultiModuleTest : AbstractFindUsagesMultiModuleTest() { doTest() } + @Test + fun testFindCommonSuperclass() { + doTest() + } + @Test fun testFindImplFromHeader() { doTest()