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()
}
}
}