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()
}
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()
}
}
}
@@ -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()
}
}
}
@@ -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()
}
}
}
@@ -1,4 +1,3 @@
expect class My constructor() {
// TODO: also should be deleted (KT-15666)
fun foo()
}
@@ -1,4 +1,2 @@
expect class My constructor() {
// TODO: also should be deleted (KT-15666)
fun foo()
}
@@ -1,4 +1,3 @@
package test
expect open class Foo
expect class ChildOfFoo : Foo()
@@ -1,4 +1,3 @@
package test
actual open class Foo
actual class ChildOfFoo : Foo()
@@ -1,7 +1,6 @@
package test
expect class Foo {
fun foo(n: Int)
}
fun test(f: Foo) {
@@ -1,9 +1,6 @@
package test
actual class Foo {
actual fun foo(n: Int) {
}
}
fun test(f: Foo) {
@@ -1,7 +1,6 @@
package test
expect class Foo {
val foo: Int
}
fun test(f: Foo) = f.foo
@@ -1,7 +1,6 @@
package test
actual class Foo {
actual val foo get() = 2
}
fun test(f: Foo) = f.foo
@@ -1,7 +1,6 @@
package test
expect open class Foo {
constructor(n: Int)
}
fun test() = Foo(1)
@@ -1,7 +1,6 @@
package test
actual open class Foo {
actual constructor(n: Int)
}
fun test() = Foo(2)
@@ -1,7 +1,5 @@
package test
expect fun foo(n: Int)
fun test() {
foo(1)
}
@@ -1,9 +1,5 @@
package test
actual fun foo(n: Int) {
}
fun test() {
foo(1)
}
@@ -1,5 +1,3 @@
package test
expect val foo: Int
fun test() = foo
@@ -1,5 +1,3 @@
package test
actual val foo get() = 2
fun test() = foo