From b13e4535f562fc59557feeb2a75f7bd4e526cbfd Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 27 Jun 2018 15:16:51 +0300 Subject: [PATCH] Safe delete: add dialog asking about expect / actual declarations Related to KT-15666 --- .../safeDelete/KotlinSafeDeleteProcessor.kt | 19 +++++++++++++++++++ .../KotlinSafeDeleteProcessor.kt.172 | 19 +++++++++++++++++++ .../KotlinSafeDeleteProcessor.kt.173 | 19 +++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt index 1ac2600c6a2..298e47a9035 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt @@ -54,6 +54,7 @@ import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchPar import org.jetbrains.kotlin.idea.search.projectScope import org.jetbrains.kotlin.idea.search.usagesSearch.processDelegationCallConstructorUsages import org.jetbrains.kotlin.idea.util.actualsForExpected +import org.jetbrains.kotlin.idea.util.isExpectDeclaration import org.jetbrains.kotlin.idea.util.liftToExpected import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* @@ -453,6 +454,16 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { ) == Messages.YES } + private fun shouldAllowPropagationToExpected(): Boolean { + if (ApplicationManager.getApplication().isUnitTestMode) return true + + return Messages.showYesNoDialog( + "Do you want to delete expected declaration together with all related actual ones?", + RefactoringBundle.message("safe.delete.title"), + Messages.getQuestionIcon() + ) == Messages.YES + } + override fun getElementsToSearch( element: PsiElement, module: Module?, allElementsToDelete: Collection ): Collection? { @@ -473,6 +484,14 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { }.ifEmpty { listOf(element) } } + is KtDeclaration -> { + if (element.hasActualModifier() || element.isExpectDeclaration()) { + if (!shouldAllowPropagationToExpected()) { + return null + } + } + } + is PsiParameter -> return checkParametersInMethodHierarchy(element) } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.172 b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.172 index 84944fd1830..31b5f246a81 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.172 +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.172 @@ -52,6 +52,7 @@ import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchPar import org.jetbrains.kotlin.idea.search.projectScope import org.jetbrains.kotlin.idea.search.usagesSearch.processDelegationCallConstructorUsages import org.jetbrains.kotlin.idea.util.actualsForExpected +import org.jetbrains.kotlin.idea.util.isExpectDeclaration import org.jetbrains.kotlin.idea.util.liftToExpected import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* @@ -445,6 +446,16 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { ) == Messages.YES } + private fun shouldAllowPropagationToExpected(): Boolean { + if (ApplicationManager.getApplication().isUnitTestMode) return true + + return Messages.showYesNoDialog( + "Do you want to delete expected declaration together with all related actual ones?", + RefactoringBundle.message("safe.delete.title"), + Messages.getQuestionIcon() + ) == Messages.YES + } + override fun getElementsToSearch( element: PsiElement, module: Module?, allElementsToDelete: Collection ): Collection? { @@ -465,6 +476,14 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { }.ifEmpty { listOf(element) } } + is KtDeclaration -> { + if (element.hasActualModifier() || element.isExpectDeclaration()) { + if (!shouldAllowPropagationToExpected()) { + return null + } + } + } + is PsiParameter -> return checkParametersInMethodHierarchy(element) } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.173 b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.173 index 3b96a75f094..e50ced40c8f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.173 +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt.173 @@ -54,6 +54,7 @@ import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchPar import org.jetbrains.kotlin.idea.search.projectScope import org.jetbrains.kotlin.idea.search.usagesSearch.processDelegationCallConstructorUsages import org.jetbrains.kotlin.idea.util.actualsForExpected +import org.jetbrains.kotlin.idea.util.isExpectDeclaration import org.jetbrains.kotlin.idea.util.liftToExpected import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* @@ -455,6 +456,16 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { ) == Messages.YES } + private fun shouldAllowPropagationToExpected(): Boolean { + if (ApplicationManager.getApplication().isUnitTestMode) return true + + return Messages.showYesNoDialog( + "Do you want to delete expected declaration together with all related actual ones?", + RefactoringBundle.message("safe.delete.title"), + Messages.getQuestionIcon() + ) == Messages.YES + } + override fun getElementsToSearch( element: PsiElement, module: Module?, allElementsToDelete: Collection ): Collection? { @@ -475,6 +486,14 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { }.ifEmpty { listOf(element) } } + is KtDeclaration -> { + if (element.hasActualModifier() || element.isExpectDeclaration()) { + if (!shouldAllowPropagationToExpected()) { + return null + } + } + } + is PsiParameter -> return checkParametersInMethodHierarchy(element) }