Safe delete: when invoking on actual, delete expect & actual neighbors

So #KT-15666 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-06-27 13:50:18 +03:00
parent 50e70e4638
commit aac71bf904
17 changed files with 75 additions and 56 deletions
@@ -382,21 +382,35 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
return result.toTypedArray() 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) { override fun prepareForDeletion(element: PsiElement) {
if (element is KtDeclaration) { if (element is KtDeclaration) {
element.actualsForExpected().forEach { if (element.hasActualModifier()) {
when (it) { val expectElement = element.liftToExpected()
is KtParameter -> { expectElement?.actualsForExpected()?.forEach {
(it.parent as? KtParameterList)?.removeParameter(it) if (it !== element) {
} it.removeOrClean()
is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> {
it.delete()
}
else -> {
it.removeModifier(KtTokens.IMPL_KEYWORD)
it.removeModifier(KtTokens.ACTUAL_KEYWORD)
} }
} }
expectElement?.removeOrClean()
} else {
element.actualsForExpected().forEach {
it.removeOrClean()
}
} }
} }
@@ -374,21 +374,35 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
return result.toTypedArray() 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) { override fun prepareForDeletion(element: PsiElement) {
if (element is KtDeclaration) { if (element is KtDeclaration) {
element.actualsForExpected().forEach { if (element.hasActualModifier()) {
when (it) { val expectElement = element.liftToExpected()
is KtParameter -> { expectElement?.actualsForExpected()?.forEach {
(it.parent as? KtParameterList)?.removeParameter(it) if (it !== element) {
} it.removeOrClean()
is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> {
it.delete()
}
else -> {
it.removeModifier(KtTokens.IMPL_KEYWORD)
it.removeModifier(KtTokens.ACTUAL_KEYWORD)
} }
} }
expectElement?.removeOrClean()
} else {
element.actualsForExpected().forEach {
it.removeOrClean()
}
} }
} }
@@ -384,21 +384,35 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
return result.toTypedArray() 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) { override fun prepareForDeletion(element: PsiElement) {
if (element is KtDeclaration) { if (element is KtDeclaration) {
element.actualsForExpected().forEach { if (element.hasActualModifier()) {
when (it) { val expectElement = element.liftToExpected()
is KtParameter -> { expectElement?.actualsForExpected()?.forEach {
(it.parent as? KtParameterList)?.removeParameter(it) if (it !== element) {
} it.removeOrClean()
is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> {
it.delete()
}
else -> {
it.removeModifier(KtTokens.IMPL_KEYWORD)
it.removeModifier(KtTokens.ACTUAL_KEYWORD)
} }
} }
expectElement?.removeOrClean()
} else {
element.actualsForExpected().forEach {
it.removeOrClean()
}
} }
} }
@@ -1,4 +1,3 @@
expect class My constructor() { expect class My constructor() {
// TODO: also should be deleted (KT-15666)
fun foo() fun foo()
} }
@@ -1,4 +1,2 @@
expect class My constructor() { expect class My constructor() {
// TODO: also should be deleted (KT-15666)
fun foo()
} }
@@ -1,4 +1,3 @@
package test package test
expect open class Foo
expect class ChildOfFoo : Foo() expect class ChildOfFoo : Foo()
@@ -1,4 +1,3 @@
package test package test
actual open class Foo
actual class ChildOfFoo : Foo() actual class ChildOfFoo : Foo()
@@ -1,7 +1,6 @@
package test package test
expect class Foo { expect class Foo {
fun foo(n: Int)
} }
fun test(f: Foo) { fun test(f: Foo) {
@@ -1,9 +1,6 @@
package test package test
actual class Foo { actual class Foo {
actual fun foo(n: Int) {
}
} }
fun test(f: Foo) { fun test(f: Foo) {
@@ -1,7 +1,6 @@
package test package test
expect class Foo { expect class Foo {
val foo: Int
} }
fun test(f: Foo) = f.foo fun test(f: Foo) = f.foo
@@ -1,7 +1,6 @@
package test package test
actual class Foo { actual class Foo {
actual val foo get() = 2
} }
fun test(f: Foo) = f.foo fun test(f: Foo) = f.foo
@@ -1,7 +1,6 @@
package test package test
expect open class Foo { expect open class Foo {
constructor(n: Int)
} }
fun test() = Foo(1) fun test() = Foo(1)
@@ -1,7 +1,6 @@
package test package test
actual open class Foo { actual open class Foo {
actual constructor(n: Int)
} }
fun test() = Foo(2) fun test() = Foo(2)
@@ -1,7 +1,5 @@
package test package test
expect fun foo(n: Int)
fun test() { fun test() {
foo(1) foo(1)
} }
@@ -1,9 +1,5 @@
package test package test
actual fun foo(n: Int) {
}
fun test() { fun test() {
foo(1) foo(1)
} }
@@ -1,5 +1,3 @@
package test package test
expect val foo: Int
fun test() = foo fun test() = foo
@@ -1,5 +1,3 @@
package test package test
actual val foo get() = 2
fun test() = foo fun test() = foo