diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtClass.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/KtClass.kt index 8cecd18a304..2d29b4d7dab 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtClass.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtClass.kt @@ -49,53 +49,6 @@ open class KtClass : KtClassOrObject { fun isSealed(): Boolean = hasModifier(KtTokens.SEALED_KEYWORD) fun isInner(): Boolean = hasModifier(KtTokens.INNER_KEYWORD) - override fun isEquivalentTo(another: PsiElement?): Boolean { - if (this === another) { - return true - } - - if (another !is KtClass) { - return false - } - - val fq1 = getQualifiedName() ?: return false - val fq2 = another.getQualifiedName() ?: return false - if (fq1 == fq2) { - val thisLocal = isLocal - if (thisLocal != another.isLocal) { - return false - } - - // For non-local classes same fqn is enough - // Consider different instances of local classes non-equivalent - return !thisLocal - } - - return false - } - - protected fun getQualifiedName(): String? { - val stub = stub - if (stub != null) { - val fqName = stub.getFqName() - return fqName?.asString() - } - - val parts = ArrayList() - var current: KtClassOrObject? = this - while (current != null) { - parts.add(current.name!!) - current = PsiTreeUtil.getParentOfType(current, KtClassOrObject::class.java) - } - val file = containingFile as? KtFile ?: return null - val fileQualifiedName = file.packageFqName.asString() - if (!fileQualifiedName.isEmpty()) { - parts.add(fileQualifiedName) - } - Collections.reverse(parts) - return StringUtil.join(parts, ".") - } - override fun getCompanionObjects(): List = getBody()?.allCompanionObjects.orEmpty() fun getClassOrInterfaceKeyword(): PsiElement? = findChildByType(TokenSet.create(KtTokens.CLASS_KEYWORD, KtTokens.INTERFACE_KEYWORD)) diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtClassOrObject.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/KtClassOrObject.kt index cac16b5323f..5953c9dd732 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtClassOrObject.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtClassOrObject.kt @@ -128,6 +128,53 @@ abstract class KtClassOrObject : file.delete() } } + + override fun isEquivalentTo(another: PsiElement?): Boolean { + if (this === another) { + return true + } + + if (another !is KtClassOrObject) { + return false + } + + val fq1 = getQualifiedName() ?: return false + val fq2 = another.getQualifiedName() ?: return false + if (fq1 == fq2) { + val thisLocal = isLocal + if (thisLocal != another.isLocal) { + return false + } + + // For non-local classes same fqn is enough + // Consider different instances of local classes non-equivalent + return !thisLocal + } + + return false + } + + protected fun getQualifiedName(): String? { + val stub = stub + if (stub != null) { + val fqName = stub.getFqName() + return fqName?.asString() + } + + val parts = mutableListOf() + var current: KtClassOrObject? = this + while (current != null) { + parts.add(current.name!!) + current = PsiTreeUtil.getParentOfType(current, KtClassOrObject::class.java) + } + val file = containingFile as? KtFile ?: return null + val fileQualifiedName = file.packageFqName.asString() + if (!fileQualifiedName.isEmpty()) { + parts.add(fileQualifiedName) + } + parts.reverse() + return parts.joinToString(separator = ".") + } } fun KtClassOrObject.getOrCreateBody(): KtClassBody { diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/Common/Common.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/Common/Common.iml new file mode 100644 index 00000000000..0ecf9949f6c --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/Common/Common.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/Common/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/Common/src/test/test.kt new file mode 100644 index 00000000000..69b35b8f90f --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/Common/src/test/test.kt @@ -0,0 +1,4 @@ +package test + +expect class A { +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JS/JS.iml new file mode 100644 index 00000000000..3de270f43fa --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JS/JS.iml @@ -0,0 +1,21 @@ + + + + + + Common + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JS/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JS/src/test/test.kt new file mode 100644 index 00000000000..666e2548ae7 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JS/src/test/test.kt @@ -0,0 +1,6 @@ +package test + +actual class A { +} + +val co = A \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JVM/JVM.iml new file mode 100644 index 00000000000..76d2b885834 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JVM/JVM.iml @@ -0,0 +1,21 @@ + + + + + + Common + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JVM/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JVM/src/test/test.kt new file mode 100644 index 00000000000..b3e5e91a92e --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/after/JVM/src/test/test.kt @@ -0,0 +1,6 @@ +package test + +actual class A { +} + +val usage = A.useful \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/Common/Common.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/Common/Common.iml new file mode 100644 index 00000000000..0ecf9949f6c --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/Common/Common.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/Common/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/Common/src/test/test.kt new file mode 100644 index 00000000000..f6601380c92 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/Common/src/test/test.kt @@ -0,0 +1,7 @@ +package test + +expect class A { + companion object { + val useful: Int + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JS/JS.iml new file mode 100644 index 00000000000..3de270f43fa --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JS/JS.iml @@ -0,0 +1,21 @@ + + + + + + Common + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JS/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JS/src/test/test.kt new file mode 100644 index 00000000000..b21983abb53 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JS/src/test/test.kt @@ -0,0 +1,9 @@ +package test + +actual class A { + actual companion object { + actual val useful: Int = 42 + } +} + +val co = A \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JVM/JVM.iml new file mode 100644 index 00000000000..76d2b885834 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JVM/JVM.iml @@ -0,0 +1,21 @@ + + + + + + Common + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JVM/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JVM/src/test/test.kt new file mode 100644 index 00000000000..8e192ff3ee0 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/before/JVM/src/test/test.kt @@ -0,0 +1,9 @@ +package test + +actual class A { + actual companion object { + actual val useful: Int = 42 + } +} + +val usage = A.useful \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/byExpectCompanion.test b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/byExpectCompanion.test new file mode 100644 index 00000000000..502de5950fd --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/byExpectCompanion.test @@ -0,0 +1,4 @@ +{ + "mainFile": "Common/src/test/test.kt", + "elementClass": "org.jetbrains.kotlin.psi.KtClassOrObject" +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/conflicts.txt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/conflicts.txt new file mode 100644 index 00000000000..a5f41c79707 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/conflicts.txt @@ -0,0 +1 @@ +companion object A.Companion has 2 usages that are not safe to delete. \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/Common/Common.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/Common/Common.iml new file mode 100644 index 00000000000..0ecf9949f6c --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/Common/Common.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/Common/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/Common/src/test/test.kt new file mode 100644 index 00000000000..c3662d9294d --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/Common/src/test/test.kt @@ -0,0 +1,3 @@ +package test + +fun barr() {} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JS/JS.iml new file mode 100644 index 00000000000..3de270f43fa --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JS/JS.iml @@ -0,0 +1,21 @@ + + + + + + Common + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JS/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JS/src/test/test.kt new file mode 100644 index 00000000000..624acc019d5 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JS/src/test/test.kt @@ -0,0 +1,5 @@ +package test + +fun foo(o: Obj) { + o.hashCode() +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JVM/JVM.iml new file mode 100644 index 00000000000..76d2b885834 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JVM/JVM.iml @@ -0,0 +1,21 @@ + + + + + + Common + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JVM/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JVM/src/test/test.kt new file mode 100644 index 00000000000..9ff36e3b4de --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/after/JVM/src/test/test.kt @@ -0,0 +1,3 @@ +package test + +val o = Obj \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/Common/Common.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/Common/Common.iml new file mode 100644 index 00000000000..0ecf9949f6c --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/Common/Common.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/Common/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/Common/src/test/test.kt new file mode 100644 index 00000000000..6c20c2129ad --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/Common/src/test/test.kt @@ -0,0 +1,5 @@ +package test + +expect object Obj + +fun barr() {} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JS/JS.iml new file mode 100644 index 00000000000..3de270f43fa --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JS/JS.iml @@ -0,0 +1,21 @@ + + + + + + Common + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JS/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JS/src/test/test.kt new file mode 100644 index 00000000000..23d58698643 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JS/src/test/test.kt @@ -0,0 +1,7 @@ +package test + +actual object Obj + +fun foo(o: Obj) { + o.hashCode() +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JVM/JVM.iml new file mode 100644 index 00000000000..76d2b885834 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JVM/JVM.iml @@ -0,0 +1,21 @@ + + + + + + Common + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JVM/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JVM/src/test/test.kt new file mode 100644 index 00000000000..ba95361d432 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/before/JVM/src/test/test.kt @@ -0,0 +1,5 @@ +package test + +actual object Obj + +val o = Obj \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/byExpectObject.test b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/byExpectObject.test new file mode 100644 index 00000000000..502de5950fd --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/byExpectObject.test @@ -0,0 +1,4 @@ +{ + "mainFile": "Common/src/test/test.kt", + "elementClass": "org.jetbrains.kotlin.psi.KtClassOrObject" +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/conflicts.txt b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/conflicts.txt new file mode 100644 index 00000000000..a0c09229cb3 --- /dev/null +++ b/idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/conflicts.txt @@ -0,0 +1 @@ +object test.Obj has 2 usages that are not safe to delete. \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/safeDelete/MultiModuleSafeDeleteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/safeDelete/MultiModuleSafeDeleteTestGenerated.java index 543f28cc605..0511ee89872 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/safeDelete/MultiModuleSafeDeleteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/safeDelete/MultiModuleSafeDeleteTestGenerated.java @@ -119,6 +119,11 @@ public class MultiModuleSafeDeleteTestGenerated extends AbstractMultiModuleSafeD runTest("idea/testData/refactoring/safeDeleteMultiModule/byExpectClassSecondaryConstructorParameter/expectsAndActualsByExpectClassSecondaryConstructorParameter.test"); } + @TestMetadata("byExpectCompanion/byExpectCompanion.test") + public void testByExpectCompanion_ByExpectCompanion() throws Exception { + runTest("idea/testData/refactoring/safeDeleteMultiModule/byExpectCompanion/byExpectCompanion.test"); + } + @TestMetadata("byExpectFun/byExpectFun.test") public void testByExpectFun_ByExpectFun() throws Exception { runTest("idea/testData/refactoring/safeDeleteMultiModule/byExpectFun/byExpectFun.test"); @@ -134,6 +139,11 @@ public class MultiModuleSafeDeleteTestGenerated extends AbstractMultiModuleSafeD runTest("idea/testData/refactoring/safeDeleteMultiModule/byExpectFunVarargParamerer/byExpectFunVarargParameter.test"); } + @TestMetadata("byExpectObject/byExpectObject.test") + public void testByExpectObject_ByExpectObject() throws Exception { + runTest("idea/testData/refactoring/safeDeleteMultiModule/byExpectObject/byExpectObject.test"); + } + @TestMetadata("byExpectVal/byExpectVal.test") public void testByExpectVal_ByExpectVal() throws Exception { runTest("idea/testData/refactoring/safeDeleteMultiModule/byExpectVal/byExpectVal.test");