From b708ab3f4d1a6123990badc895e453cbffeed8e0 Mon Sep 17 00:00:00 2001 From: Andrey Cherkasov Date: Tue, 16 Sep 2025 14:29:52 +0400 Subject: [PATCH] [kotlin] KTIJ-35524 Fix "Safe delete" of variable in when condition deleting the whole condition GitOrigin-RevId: a9243ac23571cc19ad9ca6ec27297ce9d14147bf --- .../safeDelete/SafeDeleteTestGenerated.java | 5 +++++ .../deleteProperty/kotlinProperty/when.kt | 13 +++++++++++++ .../deleteProperty/kotlinProperty/when.kt.after | 13 +++++++++++++ .../safeDelete/KotlinFirSafeDeleteProcessor.kt | 9 +++++++++ .../safeDelete/K2SafeDeleteTestGenerated.java | 5 +++++ 5 files changed, 45 insertions(+) create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/safeDelete/deleteProperty/kotlinProperty/when.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/safeDelete/deleteProperty/kotlinProperty/when.kt.after diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/safeDelete/SafeDeleteTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/safeDelete/SafeDeleteTestGenerated.java index 383d87ebfc42..b64144135e44 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/safeDelete/SafeDeleteTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/safeDelete/SafeDeleteTestGenerated.java @@ -554,6 +554,11 @@ public abstract class SafeDeleteTestGenerated extends AbstractSafeDeleteTest { public void testPropertyInLocalObject2() throws Exception { runTest("testData/refactoring/safeDelete/deleteProperty/kotlinProperty/propertyInLocalObject2.kt"); } + + @TestMetadata("when.kt") + public void testWhen() throws Exception { + runTest("testData/refactoring/safeDelete/deleteProperty/kotlinProperty/when.kt"); + } } @RunWith(JUnit3RunnerWithInners.class) diff --git a/plugins/kotlin/idea/tests/testData/refactoring/safeDelete/deleteProperty/kotlinProperty/when.kt b/plugins/kotlin/idea/tests/testData/refactoring/safeDelete/deleteProperty/kotlinProperty/when.kt new file mode 100644 index 000000000000..68c308a44654 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/safeDelete/deleteProperty/kotlinProperty/when.kt @@ -0,0 +1,13 @@ +// IGNORE_K1 +enum class Direction { + NORTH, SOUTH, WEST, EAST +} + +fun foo(direction: Direction): String { + return when (/* lead */ val x /* mid */ = /* rhs */ direction /* trail */) { + Direction.NORTH -> "north" + Direction.SOUTH -> "south" + Direction.WEST -> "west" + Direction.EAST -> "east" + } +} diff --git a/plugins/kotlin/idea/tests/testData/refactoring/safeDelete/deleteProperty/kotlinProperty/when.kt.after b/plugins/kotlin/idea/tests/testData/refactoring/safeDelete/deleteProperty/kotlinProperty/when.kt.after new file mode 100644 index 000000000000..dc39fa9747eb --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/safeDelete/deleteProperty/kotlinProperty/when.kt.after @@ -0,0 +1,13 @@ +// IGNORE_K1 +enum class Direction { + NORTH, SOUTH, WEST, EAST +} + +fun foo(direction: Direction): String { + return when (/* lead */ /* mid */ /* rhs */ direction /* trail */) { + Direction.NORTH -> "north" + Direction.SOUTH -> "south" + Direction.WEST -> "west" + Direction.EAST -> "east" + } +} diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/safeDelete/KotlinFirSafeDeleteProcessor.kt b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/safeDelete/KotlinFirSafeDeleteProcessor.kt index 67ad525a9aad..f33b6d36bf6d 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/safeDelete/KotlinFirSafeDeleteProcessor.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/safeDelete/KotlinFirSafeDeleteProcessor.kt @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.search.ExpectActualUtils import org.jetbrains.kotlin.idea.searching.inheritors.DirectKotlinClassInheritorsSearch import org.jetbrains.kotlin.idea.searching.inheritors.findAllOverridings +import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.idea.util.application.isUnitTestMode import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* @@ -357,6 +358,14 @@ class KotlinFirSafeDeleteProcessor : SafeDeleteProcessorDelegateBase() { deleteBracesAroundEmptyList(element) } + is KtProperty if ((element.parent as? KtWhenExpression)?.subjectVariable === element) -> { + val commentSaver = CommentSaver(element) + element.initializer?.let { initializer -> + val replaced = element.replace(initializer.copy()) + commentSaver.restore(replaced) + } + } + is KtParameter -> { element.ownerFunction?.let { with(KotlinSafeDeleteSettings) { diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/safeDelete/K2SafeDeleteTestGenerated.java b/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/safeDelete/K2SafeDeleteTestGenerated.java index 95707ed018d3..9dbca4f5fb6c 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/safeDelete/K2SafeDeleteTestGenerated.java +++ b/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/safeDelete/K2SafeDeleteTestGenerated.java @@ -525,6 +525,11 @@ public abstract class K2SafeDeleteTestGenerated extends AbstractK2SafeDeleteTest public void testPropertyInLocalObject2() throws Exception { runTest("../../idea/tests/testData/refactoring/safeDelete/deleteProperty/kotlinProperty/propertyInLocalObject2.kt"); } + + @TestMetadata("when.kt") + public void testWhen() throws Exception { + runTest("../../idea/tests/testData/refactoring/safeDelete/deleteProperty/kotlinProperty/when.kt"); + } } @RunWith(JUnit3RunnerWithInners.class)