Safe delete: when invoking on expect, delete also relevant actual

Partial fix of KT-15666
This commit is contained in:
Mikhail Glukhikh
2018-06-27 13:04:24 +03:00
parent 465d5c077e
commit 50e70e4638
15 changed files with 34 additions and 45 deletions
@@ -57,10 +57,7 @@ import org.jetbrains.kotlin.idea.util.actualsForExpected
import org.jetbrains.kotlin.idea.util.liftToExpected import org.jetbrains.kotlin.idea.util.liftToExpected
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
import org.jetbrains.kotlin.psi.psiUtil.parameterIndex
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.utils.SmartSet import org.jetbrains.kotlin.utils.SmartSet
@@ -388,11 +385,17 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
override fun prepareForDeletion(element: PsiElement) { override fun prepareForDeletion(element: PsiElement) {
if (element is KtDeclaration) { if (element is KtDeclaration) {
element.actualsForExpected().forEach { element.actualsForExpected().forEach {
if (it is KtParameter) { when (it) {
(it.parent as? KtParameterList)?.removeParameter(it) is KtParameter -> {
} else { (it.parent as? KtParameterList)?.removeParameter(it)
it.removeModifier(KtTokens.IMPL_KEYWORD) }
it.removeModifier(KtTokens.ACTUAL_KEYWORD) is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> {
it.delete()
}
else -> {
it.removeModifier(KtTokens.IMPL_KEYWORD)
it.removeModifier(KtTokens.ACTUAL_KEYWORD)
}
} }
} }
} }
@@ -377,12 +377,17 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
override fun prepareForDeletion(element: PsiElement) { override fun prepareForDeletion(element: PsiElement) {
if (element is KtDeclaration) { if (element is KtDeclaration) {
element.actualsForExpected().forEach { element.actualsForExpected().forEach {
if (it is KtParameter) { when (it) {
(it.parent as? KtParameterList)?.removeParameter(it) is KtParameter -> {
} (it.parent as? KtParameterList)?.removeParameter(it)
else { }
it.removeModifier(KtTokens.IMPL_KEYWORD) is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> {
it.removeModifier(KtTokens.ACTUAL_KEYWORD) it.delete()
}
else -> {
it.removeModifier(KtTokens.IMPL_KEYWORD)
it.removeModifier(KtTokens.ACTUAL_KEYWORD)
}
} }
} }
} }
@@ -387,12 +387,17 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
override fun prepareForDeletion(element: PsiElement) { override fun prepareForDeletion(element: PsiElement) {
if (element is KtDeclaration) { if (element is KtDeclaration) {
element.actualsForExpected().forEach { element.actualsForExpected().forEach {
if (it is KtParameter) { when (it) {
(it.parent as? KtParameterList)?.removeParameter(it) is KtParameter -> {
} (it.parent as? KtParameterList)?.removeParameter(it)
else { }
it.removeModifier(KtTokens.IMPL_KEYWORD) is KtCallableDeclaration, is KtClassOrObject, is KtTypeAlias -> {
it.removeModifier(KtTokens.ACTUAL_KEYWORD) it.delete()
}
else -> {
it.removeModifier(KtTokens.IMPL_KEYWORD)
it.removeModifier(KtTokens.ACTUAL_KEYWORD)
}
} }
} }
} }
@@ -1,4 +1,3 @@
package test package test
open class Foo
actual class ChildOfFoo : Foo() actual class ChildOfFoo : Foo()
@@ -1,4 +1,3 @@
package test package test
open class Foo
actual class ChildOfFoo : Foo() actual class ChildOfFoo : Foo()
@@ -1,9 +1,6 @@
package test package test
actual class Foo { actual 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 {
fun foo(n: Int) {
}
} }
fun test(f: Foo) { fun test(f: Foo) {
@@ -1,7 +1,6 @@
package test package test
actual class Foo { actual class Foo {
val foo get() = 1
} }
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 {
val foo get() = 2
} }
fun test(f: Foo) = f.foo fun test(f: Foo) = f.foo
@@ -1,7 +1,6 @@
package test package test
actual open class Foo { actual 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 {
constructor(n: Int)
} }
fun test() = Foo(2) fun test() = Foo(2)
@@ -1,9 +1,5 @@
package test package test
fun foo(n: Int) {
}
fun test() { fun test() {
foo(1) foo(1)
} }
@@ -1,9 +1,5 @@
package test package test
fun foo(n: Int) {
}
fun test() { fun test() {
foo(1) foo(1)
} }
@@ -1,5 +1,3 @@
package test package test
val foo get() = 1
fun test() = foo fun test() = foo
@@ -1,5 +1,3 @@
package test package test
val foo get() = 2
fun test() = foo fun test() = foo