diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt index 7d640faa466..1ac2600c6a2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt @@ -382,21 +382,35 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { return result.toTypedArray() } + private fun KtDeclaration.removeOrClean() { + when (this) { + is KtParameter -> { + (parent as? KtParameterList)?.removeParameter(this) + } + is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> { + delete() + } + else -> { + removeModifier(KtTokens.IMPL_KEYWORD) + removeModifier(KtTokens.ACTUAL_KEYWORD) + } + } + } + override fun prepareForDeletion(element: PsiElement) { if (element is KtDeclaration) { - element.actualsForExpected().forEach { - when (it) { - is KtParameter -> { - (it.parent as? KtParameterList)?.removeParameter(it) - } - is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> { - it.delete() - } - else -> { - it.removeModifier(KtTokens.IMPL_KEYWORD) - it.removeModifier(KtTokens.ACTUAL_KEYWORD) + if (element.hasActualModifier()) { + val expectElement = element.liftToExpected() + expectElement?.actualsForExpected()?.forEach { + if (it !== element) { + it.removeOrClean() } } + expectElement?.removeOrClean() + } else { + element.actualsForExpected().forEach { + it.removeOrClean() + } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.172 b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.172 index 99e1275380e..84944fd1830 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.172 +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.172 @@ -374,21 +374,35 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { return result.toTypedArray() } + private fun KtDeclaration.removeOrClean() { + when (this) { + is KtParameter -> { + (parent as? KtParameterList)?.removeParameter(this) + } + is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> { + delete() + } + else -> { + removeModifier(KtTokens.IMPL_KEYWORD) + removeModifier(KtTokens.ACTUAL_KEYWORD) + } + } + } + override fun prepareForDeletion(element: PsiElement) { if (element is KtDeclaration) { - element.actualsForExpected().forEach { - when (it) { - is KtParameter -> { - (it.parent as? KtParameterList)?.removeParameter(it) - } - is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> { - it.delete() - } - else -> { - it.removeModifier(KtTokens.IMPL_KEYWORD) - it.removeModifier(KtTokens.ACTUAL_KEYWORD) + if (element.hasActualModifier()) { + val expectElement = element.liftToExpected() + expectElement?.actualsForExpected()?.forEach { + if (it !== element) { + it.removeOrClean() } } + expectElement?.removeOrClean() + } else { + element.actualsForExpected().forEach { + it.removeOrClean() + } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.173 b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.173 index 3168a77fa74..3b96a75f094 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.173 +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.173 @@ -384,21 +384,35 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { return result.toTypedArray() } + private fun KtDeclaration.removeOrClean() { + when (this) { + is KtParameter -> { + (parent as? KtParameterList)?.removeParameter(this) + } + is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> { + delete() + } + else -> { + removeModifier(KtTokens.IMPL_KEYWORD) + removeModifier(KtTokens.ACTUAL_KEYWORD) + } + } + } + override fun prepareForDeletion(element: PsiElement) { if (element is KtDeclaration) { - element.actualsForExpected().forEach { - when (it) { - is KtParameter -> { - (it.parent as? KtParameterList)?.removeParameter(it) - } - is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> { - it.delete() - } - else -> { - it.removeModifier(KtTokens.IMPL_KEYWORD) - it.removeModifier(KtTokens.ACTUAL_KEYWORD) + if (element.hasActualModifier()) { + val expectElement = element.liftToExpected() + expectElement?.actualsForExpected()?.forEach { + if (it !== element) { + it.removeOrClean() } } + expectElement?.removeOrClean() + } else { + element.actualsForExpected().forEach { + it.removeOrClean() + } } } diff --git a/idea/testData/multiModuleQuickFix/safeDeleteFromActual/common/common.kt b/idea/testData/multiModuleQuickFix/safeDeleteFromActual/common/common.kt index c301ddfdb93..2132efe1c49 100644 --- a/idea/testData/multiModuleQuickFix/safeDeleteFromActual/common/common.kt +++ b/idea/testData/multiModuleQuickFix/safeDeleteFromActual/common/common.kt @@ -1,4 +1,3 @@ expect class My constructor() { - // TODO: also should be deleted (KT-15666) fun foo() } \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/safeDeleteFromActual/common/common.kt.after b/idea/testData/multiModuleQuickFix/safeDeleteFromActual/common/common.kt.after index c301ddfdb93..26f0c0ed26c 100644 --- a/idea/testData/multiModuleQuickFix/safeDeleteFromActual/common/common.kt.after +++ b/idea/testData/multiModuleQuickFix/safeDeleteFromActual/common/common.kt.after @@ -1,4 +1,2 @@ expect class My constructor() { - // TODO: also should be deleted (KT-15666) - fun foo() } \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/Common/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/Common/src/test/test.kt index cb0a8f4a9ec..0c77b26c98d 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/Common/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/Common/src/test/test.kt @@ -1,4 +1,3 @@ package test -expect open class Foo expect class ChildOfFoo : Foo() \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JVM/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JVM/src/test/test.kt index d15c4242e7a..05ea9e66143 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JVM/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JVM/src/test/test.kt @@ -1,4 +1,3 @@ package test -actual open class Foo actual class ChildOfFoo : Foo() \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/Common/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/Common/src/test/test.kt index 0092a8d2198..f3e63fd62b6 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/Common/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/Common/src/test/test.kt @@ -1,7 +1,6 @@ package test expect class Foo { - fun foo(n: Int) } fun test(f: Foo) { diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JVM/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JVM/src/test/test.kt index 8ddf0fd6a80..36d9a7fe23b 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JVM/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JVM/src/test/test.kt @@ -1,9 +1,6 @@ package test actual class Foo { - actual fun foo(n: Int) { - - } } fun test(f: Foo) { diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/Common/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/Common/src/test/test.kt index 44368b0c8b0..9051f41f42d 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/Common/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/Common/src/test/test.kt @@ -1,7 +1,6 @@ package test expect class Foo { - val foo: Int } fun test(f: Foo) = f.foo \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JVM/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JVM/src/test/test.kt index 66589737f17..566655aa728 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JVM/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JVM/src/test/test.kt @@ -1,7 +1,6 @@ package test actual class Foo { - actual val foo get() = 2 } fun test(f: Foo) = f.foo \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/Common/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/Common/src/test/test.kt index 93e7876dfb4..3fce5c966e7 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/Common/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/Common/src/test/test.kt @@ -1,7 +1,6 @@ package test expect open class Foo { - constructor(n: Int) } fun test() = Foo(1) \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JVM/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JVM/src/test/test.kt index f5a71de5f13..7191d532154 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JVM/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JVM/src/test/test.kt @@ -1,7 +1,6 @@ package test actual open class Foo { - actual constructor(n: Int) } fun test() = Foo(2) \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/Common/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/Common/src/test/test.kt index 69818a51191..a77302d41cb 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/Common/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/Common/src/test/test.kt @@ -1,7 +1,5 @@ package test -expect fun foo(n: Int) - fun test() { foo(1) } \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JVM/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JVM/src/test/test.kt index ea87a4c91a6..a77302d41cb 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JVM/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JVM/src/test/test.kt @@ -1,9 +1,5 @@ package test -actual fun foo(n: Int) { - -} - fun test() { foo(1) } \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/Common/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/Common/src/test/test.kt index 978ee4a0cfa..7691e56ec64 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/Common/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/Common/src/test/test.kt @@ -1,5 +1,3 @@ package test -expect val foo: Int - fun test() = foo \ No newline at end of file diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JVM/src/test/test.kt b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JVM/src/test/test.kt index 6fdbad24c5a..7691e56ec64 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JVM/src/test/test.kt +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JVM/src/test/test.kt @@ -1,5 +1,3 @@ package test -actual val foo get() = 2 - fun test() = foo \ No newline at end of file