[extract method] clean up: extract new method

GitOrigin-RevId: 2eebf8a710386df60b9ffb143f0281687f27d1ba
This commit is contained in:
Alexandr Suhinin
2023-10-13 12:03:53 +03:00
committed by intellij-monorepo-bot
parent 3f0fa71a39
commit d150e6730c

View File

@@ -107,26 +107,13 @@ class DuplicatesMethodExtractor(val extractOptions: ExtractOptions, val targetCl
val exactDuplicates = duplicates.filter { duplicate ->
duplicate.parametrizedExpressions.all { changedExpression -> changedExpression.pattern in initialParameters }
}
val oldMethodCall = findMethodCallInside(calls.firstOrNull())
val newMethodCall = findMethodCallInside(parametrizedExtraction.callElements.firstOrNull())
fun confirmChangeSignature(): Boolean {
if (oldMethodCall == null || newMethodCall == null) return false
val manager = CodeStyleManager.getInstance(project)
val initialMethod = manager.reformat(method.copy()) as PsiMethod
val parametrizedMethod = manager.reformat(parametrizedExtraction.method) as PsiMethod
val dialog = SignatureSuggesterPreviewDialog(initialMethod, parametrizedMethod, oldMethodCall, newMethodCall,
exactDuplicates.size, duplicates.size - exactDuplicates.size)
return dialog.showAndGet()
}
val confirmChange: () -> Boolean = changeSignatureDefault?.let { default -> {default} } ?: ::confirmChangeSignature
val isGoodSignatureChange = isGoodSignatureChange(extractOptions.elements, extractOptions.inputParameters,
parametrizedExtraction.callElements, updatedParameters)
val prepareTimeEnd = System.currentTimeMillis()
InplaceExtractMethodCollector.duplicatesSearched.log(prepareTimeEnd - prepareTimeStart)
val changeSignature = duplicates.size > exactDuplicates.size && isGoodSignatureChange && confirmChange()
duplicates = if (changeSignature) duplicatesWithUnifiedParameters else exactDuplicates
val parameters = if (changeSignature) updatedParameters else extractOptions.inputParameters
val extractedElements = if (changeSignature) parametrizedExtraction else ExtractedElements(calls, method)
val shouldChangeSignature = askToChangeSignature(calls, parametrizedExtraction, project, method, exactDuplicates, duplicates, updatedParameters)
duplicates = if (shouldChangeSignature) duplicatesWithUnifiedParameters else exactDuplicates
val parameters = if (shouldChangeSignature) updatedParameters else extractOptions.inputParameters
val extractedElements = if (shouldChangeSignature) parametrizedExtraction else ExtractedElements(calls, method)
duplicates = when (replaceDuplicatesDefault) {
null -> confirmDuplicates (project, editor, duplicates)
@@ -156,6 +143,33 @@ class DuplicatesMethodExtractor(val extractOptions: ExtractOptions, val targetCl
}
}
private fun askToChangeSignature(calls: List<PsiElement>,
parametrizedExtraction: ExtractedElements,
project: Project,
method: PsiMethod,
exactDuplicates: List<Duplicate>,
duplicates: List<Duplicate>,
updatedParameters: List<InputParameter>): Boolean {
val oldMethodCall = findMethodCallInside(calls.firstOrNull())
val newMethodCall = findMethodCallInside(parametrizedExtraction.callElements.firstOrNull())
fun confirmChangeSignature(): Boolean {
if (oldMethodCall == null || newMethodCall == null) return false
val manager = CodeStyleManager.getInstance(project)
val initialMethod = manager.reformat(method.copy()) as PsiMethod
val parametrizedMethod = manager.reformat(parametrizedExtraction.method) as PsiMethod
val dialog = SignatureSuggesterPreviewDialog(initialMethod, parametrizedMethod, oldMethodCall, newMethodCall,
exactDuplicates.size, duplicates.size - exactDuplicates.size)
return dialog.showAndGet()
}
val confirmChange: () -> Boolean = changeSignatureDefault?.let { default -> { default } } ?: ::confirmChangeSignature
val isGoodSignatureChange = isGoodSignatureChange(extractOptions.elements, extractOptions.inputParameters,
parametrizedExtraction.callElements, updatedParameters)
val changeSignature = duplicates.size > exactDuplicates.size && isGoodSignatureChange && confirmChange()
return changeSignature
}
private fun createExtractDescriptor(duplicate: Duplicate, parameters: List<InputParameter>): ExtractOptions {
val expressionMap = duplicate.parametrizedExpressions.associate { (pattern, candidate) -> pattern to candidate }
fun getMappedParameter(parameter: InputParameter): InputParameter {