diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/DuplicatesMethodExtractor.kt b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/DuplicatesMethodExtractor.kt index efcc23286074..6b01048c7a02 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/DuplicatesMethodExtractor.kt +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/DuplicatesMethodExtractor.kt @@ -26,6 +26,12 @@ import com.siyeh.ig.psiutils.SideEffectChecker.mayHaveSideEffects class DuplicatesMethodExtractor: InplaceExtractMethodProvider { + companion object { + private val isSilentMode = ApplicationManager.getApplication().isUnitTestMode + var changeSignatureDefault: Boolean? = true.takeIf { isSilentMode } + var replaceDuplicatesDefault: Boolean? = true.takeIf { isSilentMode } + } + private var duplicatesFinder: JavaDuplicatesFinder? = null private var callsToReplace: List>? = null @@ -103,14 +109,17 @@ class DuplicatesMethodExtractor: InplaceExtractMethodProvider { val dialog = SignatureSuggesterPreviewDialog(method, parametrizedExtraction.method, oldMethodCall, newMethodCall, parametrizedDuplicatesNumber) return dialog.showAndGet() } - - val changeSignature = parametrizedDuplicatesNumber > 0 && (isSilentMode || confirmChangeSignature()) + val confirmChange: () -> Boolean = changeSignatureDefault?.let { default -> {default} } ?: ::confirmChangeSignature + val changeSignature = parametrizedDuplicatesNumber > 0 && confirmChange() duplicates = if (changeSignature) duplicatesWithUnifiedParameters else exactDuplicates val parameters = if (changeSignature) updatedParameters else options.inputParameters val extractedElements = if (changeSignature) parametrizedExtraction else MethodExtractor.ExtractedElements(calls, method) - duplicates = confirmDuplicates(project, editor, duplicates) - if (duplicates.isEmpty()) return + duplicates = when (replaceDuplicatesDefault) { + null -> confirmDuplicates (project, editor, duplicates) + true -> duplicates + false -> emptyList() + } val replacedMethod = runWriteAction { replacePsiRange(calls, extractedElements.callElements) @@ -152,8 +161,6 @@ class DuplicatesMethodExtractor: InplaceExtractMethodProvider { return firstRange.intersects(secondRange) } - private val isSilentMode = ApplicationManager.getApplication().isUnitTestMode - private fun findNewParameters(parameters: List, duplicates: List): List { return duplicates .fold(parameters) { updatedParameters, duplicate -> updateParameters(updatedParameters, duplicate.changedExpressions) } @@ -161,7 +168,6 @@ class DuplicatesMethodExtractor: InplaceExtractMethodProvider { private fun confirmDuplicates(project: Project, editor: Editor, duplicates: List): List { if (duplicates.isEmpty()) return duplicates - if (isSilentMode) return duplicates val initialPosition = editor.caretModel.logicalPosition val confirmedDuplicates = mutableListOf() duplicates.forEach { duplicate -> diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedButDeclined.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedButDeclined.java new file mode 100644 index 000000000000..d1bc7f97c3b3 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedButDeclined.java @@ -0,0 +1,10 @@ +public class Test { + void test(boolean condition) { + foo("one"); + foo("one"); + foo("two"); + } + + void foo(String name) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedButDeclined_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedButDeclined_after.java new file mode 100644 index 000000000000..8d4913c134c7 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedButDeclined_after.java @@ -0,0 +1,14 @@ +public class Test { + void test(boolean condition) { + extracted("one"); + foo("one"); + foo("two"); + } + + private void extracted(String one) { + foo(one); + } + + void foo(String name) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedWithDeclinedChangeSignature.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedWithDeclinedChangeSignature.java new file mode 100644 index 000000000000..d1bc7f97c3b3 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedWithDeclinedChangeSignature.java @@ -0,0 +1,10 @@ +public class Test { + void test(boolean condition) { + foo("one"); + foo("one"); + foo("two"); + } + + void foo(String name) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedWithDeclinedChangeSignature_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedWithDeclinedChangeSignature_after.java new file mode 100644 index 000000000000..58dae6cfb948 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DuplicatedWithDeclinedChangeSignature_after.java @@ -0,0 +1,14 @@ +public class Test { + void test(boolean condition) { + extracted(); + extracted(); + foo("two"); + } + + private void extracted() { + foo("one"); + } + + void foo(String name) { + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt index 68ebca487677..06e19b436e54 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt @@ -11,6 +11,7 @@ import com.intellij.openapi.util.registry.Registry import com.intellij.pom.java.LanguageLevel import com.intellij.refactoring.RefactoringBundle import com.intellij.refactoring.extractMethod.newImpl.MethodExtractor +import com.intellij.refactoring.extractMethod.newImpl.inplace.DuplicatesMethodExtractor import com.intellij.refactoring.listeners.RefactoringEventData import com.intellij.refactoring.listeners.RefactoringEventListener import com.intellij.refactoring.util.CommonRefactoringUtil.RefactoringErrorHintException @@ -206,6 +207,26 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() { doTest() } + fun testDuplicatedWithDeclinedChangeSignature(){ + val default = DuplicatesMethodExtractor.changeSignatureDefault + try { + DuplicatesMethodExtractor.changeSignatureDefault = false + doTest() + } finally { + DuplicatesMethodExtractor.changeSignatureDefault = default + } + } + + fun testDuplicatedButDeclined(){ + val default = DuplicatesMethodExtractor.replaceDuplicatesDefault + try { + DuplicatesMethodExtractor.replaceDuplicatesDefault = false + doTest() + } finally { + DuplicatesMethodExtractor.replaceDuplicatesDefault = default + } + } + fun testRefactoringListener(){ templateTest { configureByFile("$BASE_PATH/${getTestName(false)}.java")