From 6ae989e3309b7e5a93a033e621730c93e4f1f1e4 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 2 Mar 2015 18:03:41 +0300 Subject: [PATCH] Introduce Property: Duplicate search & replace --- .../extractionEngine/duplicateUtil.kt | 6 +++++ .../extractionEngine/extractorUtil.kt | 5 ++-- .../KotlinInplacePropertyIntroducer.kt | 23 +++++++++++++++++++ .../KotlinIntroducePropertyHandler.kt | 3 +++ .../introduceProperty/replaceDuplicates.kt | 9 ++++++++ .../replaceDuplicates.kt.after | 11 +++++++++ .../JetExtractionTestGenerated.java | 6 +++++ 7 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 idea/testData/refactoring/introduceProperty/replaceDuplicates.kt create mode 100644 idea/testData/refactoring/introduceProperty/replaceDuplicates.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/duplicateUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/duplicateUtil.kt index e812b18fa67..b1f7a180acf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/duplicateUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/duplicateUtil.kt @@ -110,4 +110,10 @@ public fun processDuplicates( project.executeWriteCommand(MethodDuplicatesHandler.REFACTORING_NAME, replacer) } +} + +public fun processDuplicatesSilently(duplicateReplacers: Map Unit>, project: Project) { + project.executeWriteCommand(MethodDuplicatesHandler.REFACTORING_NAME) { + duplicateReplacers.values().forEach { it() } + } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt index 673f7790b06..382b88718b2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt @@ -244,10 +244,11 @@ private fun makeCall( } } + val calleeName = declaration.getName() val callText = when (declaration) { is JetNamedFunction -> - arguments.joinToString(separator = ", ", prefix = "${extractableDescriptor.name}(", postfix = ")") - else -> extractableDescriptor.name + arguments.joinToString(separator = ", ", prefix = "$calleeName(", postfix = ")") + else -> calleeName } val anchorInBlock = stream(anchor) { it.getParent() }.firstOrNull { it.getParent() is JetBlockExpression } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceProperty/KotlinInplacePropertyIntroducer.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceProperty/KotlinInplacePropertyIntroducer.kt index a409dffc34d..09155c2a8ba 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceProperty/KotlinInplacePropertyIntroducer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceProperty/KotlinInplacePropertyIntroducer.kt @@ -66,6 +66,8 @@ public class KotlinInplacePropertyIntroducer( updatePanelControls() } + private var replaceAll: Boolean = true + private fun isInitializer(): Boolean = currentTarget == ExtractionTarget.PROPERTY_WITH_INITIALIZER override fun initPanelControls() { @@ -121,6 +123,20 @@ public class KotlinInplacePropertyIntroducer( addPanelControl(ControlWrapper(it, condition, initializer)) } } + + + val occurrenceCount = extractionResult.duplicateReplacers.size() + 1 + if (occurrenceCount > 1) { + addPanelControl( + ControlWrapper { + val replaceAllCheckBox = NonFocusableCheckBox("Replace all occurrences ($occurrenceCount)") + replaceAllCheckBox.setSelected(replaceAll) + replaceAllCheckBox.setMnemonic('R') + replaceAllCheckBox.addActionListener { replaceAll = replaceAllCheckBox.isSelected() } + replaceAllCheckBox + } + ) + } } override fun addTypeReferenceVariable(builder: TemplateBuilderImpl) { @@ -131,4 +147,11 @@ public class KotlinInplacePropertyIntroducer( override fun checkLocalScope(): PsiElement? { return myElementToRename.parents().first { it is JetClassOrObject || it is JetFile } } + + override fun moveOffsetAfter(success: Boolean) { + super.moveOffsetAfter(success) + if (success && replaceAll) { + processDuplicatesSilently(extractionResult.duplicateReplacers, myProject) + } + } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceProperty/KotlinIntroducePropertyHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceProperty/KotlinIntroducePropertyHandler.kt index 776cfc7b654..5969e75fc96 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceProperty/KotlinIntroducePropertyHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceProperty/KotlinIntroducePropertyHandler.kt @@ -89,6 +89,9 @@ public class KotlinIntroducePropertyHandler( ) introducer.performInplaceRefactoring(LinkedHashSet(descriptor.suggestedNames)) } + else { + processDuplicatesSilently(it.duplicateReplacers, project) + } } } else { diff --git a/idea/testData/refactoring/introduceProperty/replaceDuplicates.kt b/idea/testData/refactoring/introduceProperty/replaceDuplicates.kt new file mode 100644 index 00000000000..c87c34a27e8 --- /dev/null +++ b/idea/testData/refactoring/introduceProperty/replaceDuplicates.kt @@ -0,0 +1,9 @@ +// EXTRACTION_TARGET: property with initializer + +class A(val n: Int) { + fun foo(k: Int) { + val a = n + 1 + val b = n + 1 - 2 + val c = foo(n + 1) + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceProperty/replaceDuplicates.kt.after b/idea/testData/refactoring/introduceProperty/replaceDuplicates.kt.after new file mode 100644 index 00000000000..0d2d6b93194 --- /dev/null +++ b/idea/testData/refactoring/introduceProperty/replaceDuplicates.kt.after @@ -0,0 +1,11 @@ +// EXTRACTION_TARGET: property with initializer + +class A(val n: Int) { + fun foo(k: Int) { + val a = i + val b = i - 2 + val c = foo(i) + } + + private val i = n + 1 +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java index b62542fb24c..c46a9537161 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java @@ -2037,5 +2037,11 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceProperty/extractWithParams.kt"); doIntroducePropertyTest(fileName); } + + @TestMetadata("replaceDuplicates.kt") + public void testReplaceDuplicates() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceProperty/replaceDuplicates.kt"); + doIntroducePropertyTest(fileName); + } } }