diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractableCodeDescriptor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractableCodeDescriptor.kt index 8e5d8a06aed..40e3ce695f0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractableCodeDescriptor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractableCodeDescriptor.kt @@ -407,7 +407,8 @@ data class ExtractionGeneratorOptions( val target: ExtractionTarget = ExtractionTarget.FUNCTION, val flexibleTypesAllowed: Boolean = false, val allowDummyName: Boolean = false, - val allowExpressionBody: Boolean = true + val allowExpressionBody: Boolean = true, + val delayInitialOccurrenceReplacement: Boolean = false ) { companion object { val DEFAULT = ExtractionGeneratorOptions() 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 ed85336c7ea..e54cf03fc97 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 @@ -644,14 +644,25 @@ fun ExtractionGeneratorConfiguration.generateDeclaration( if (generatorOptions.inTempFile) return ExtractionResult(this, declaration, Collections.emptyMap(), nameByOffset) - makeCall(descriptor, declaration, descriptor.controlFlow, descriptor.extractionData.originalRange, descriptor.parameters.map { it.argumentText }) + val replaceInitialOccurrence = { + val arguments = descriptor.parameters.map { it.argumentText } + makeCall(descriptor, declaration, descriptor.controlFlow, descriptor.extractionData.originalRange, arguments) + } + + if (!generatorOptions.delayInitialOccurrenceReplacement) replaceInitialOccurrence() + if (shouldInsert) { ShortenReferences.DEFAULT.process(declaration) } if (generatorOptions.inTempFile) return ExtractionResult(this, declaration, emptyMap(), nameByOffset) - val duplicateReplacers = duplicates.map { it.range to { makeCall(descriptor, declaration, it.controlFlow, it.range, it.arguments) } }.toMap() + val duplicateReplacers = HashMap Unit>().apply { + if (generatorOptions.delayInitialOccurrenceReplacement) { + put(descriptor.extractionData.originalRange, replaceInitialOccurrence) + } + putAll(duplicates.map { it.range to { makeCall(descriptor, declaration, it.controlFlow, it.range, it.arguments) } }) + } if (descriptor.typeParameters.isNotEmpty()) { for (ref in ReferencesSearch.search(declaration, LocalSearchScope(descriptor.getOccurrenceContainer()!!))) { 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 e30848e327a..e988df2154d 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 @@ -137,7 +137,6 @@ public class KotlinInplacePropertyIntroducer( } } - val occurrenceCount = extractionResult.duplicateReplacers.size() + 1 if (occurrenceCount > 1) { addPanelControl( @@ -161,10 +160,10 @@ public class KotlinInplacePropertyIntroducer( return myElementToRename.parentsWithSelf.first { it is KtClassOrObject || it is KtFile } } - override fun moveOffsetAfter(success: Boolean) { - super.moveOffsetAfter(success) - if (success && replaceAll) { + override fun performRefactoring(): Boolean { + if (replaceAll) { processDuplicatesSilently(extractionResult.duplicateReplacers, myProject) } + return true } } \ 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 3e7487f0f82..a873e7d7e14 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 @@ -45,7 +45,8 @@ public class KotlinIntroducePropertyHandler( val descriptor = descriptorWithConflicts.descriptor val target = propertyTargets.filter { it.isAvailable(descriptor) }.firstOrNull() if (target != null) { - doRefactor(ExtractionGeneratorConfiguration(descriptor, ExtractionGeneratorOptions.DEFAULT.copy(target = target)), onFinish) + val options = ExtractionGeneratorOptions.DEFAULT.copy(target = target, delayInitialOccurrenceReplacement = true) + doRefactor(ExtractionGeneratorConfiguration(descriptor, options), onFinish) } else { showErrorHint(project, editor, "Can't introduce property for this expression", INTRODUCE_PROPERTY) diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractExtractionTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractExtractionTest.kt index 2b879d263de..4fed5289c26 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractExtractionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractExtractionTest.kt @@ -219,7 +219,7 @@ public abstract class AbstractExtractionTest() : KotlinLightCodeInsightFixtureTe doRefactor( ExtractionGeneratorConfiguration( descriptorWithConflicts.descriptor, - ExtractionGeneratorOptions.DEFAULT.copy(target = extractionTarget) + ExtractionGeneratorOptions.DEFAULT.copy(target = extractionTarget, delayInitialOccurrenceReplacement = true) ), onFinish )