[extract duplicates] IDEA-285135: make main method static if duplicates are in static context

GitOrigin-RevId: 238b34892819401c23a6853f81e5664779e00136
This commit is contained in:
Alexandr Suhinin
2023-02-16 09:28:26 +02:00
committed by intellij-monorepo-bot
parent d303aaa9b2
commit 990b365dd5
4 changed files with 46 additions and 8 deletions

View File

@@ -126,20 +126,29 @@ class DuplicatesMethodExtractor(val extractOptions: ExtractOptions, val anchor:
false -> emptyList()
}
val replacedMethod = runWriteAction {
replacePsiRange(calls, extractedElements.callElements)
method.replace(extractedElements.method) as PsiMethod
}
duplicates.forEach { duplicate ->
val duplicatesExtractOptions = duplicates.map { duplicate ->
val expressionMap = duplicate.changedExpressions.associate { (pattern, candidate) -> pattern to candidate }
fun getMappedParameter(parameter: InputParameter): InputParameter {
val references = parameter.references.map { expression -> expressionMap[expression] ?: expression }
return parameter.copy(references = references)
}
val duplicateOptions = findExtractOptions(duplicate.candidate).copy(inputParameters = parameters.map(::getMappedParameter))
val callElements = CallBuilder(duplicateOptions.elements.first()).createCall(replacedMethod, duplicateOptions)
findExtractOptions(duplicate.candidate).copy(inputParameters = parameters.map(::getMappedParameter))
}
if (duplicatesExtractOptions.any { options -> options.isStatic }) {
runWriteAction {
extractedElements.method.modifierList.setModifierProperty(PsiModifier.STATIC, true)
}
}
val replacedMethod = runWriteAction {
replacePsiRange(calls, extractedElements.callElements)
method.replace(extractedElements.method) as PsiMethod
}
duplicates.zip(duplicatesExtractOptions).forEach { (duplicate, extractOptions) ->
val callElements = CallBuilder(extractOptions.elements.first()).createCall(replacedMethod, extractOptions)
runWriteAction {
replacePsiRange(duplicate.candidate, callElements)
}

View File

@@ -0,0 +1,9 @@
public class Test {
static void staticContext() {
System.out.println("hi");
}
void nonStaticContext() {
<selection>System.out.println("hi");</selection>
}
}

View File

@@ -0,0 +1,13 @@
public class Test {
static void staticContext() {
extracted();
}
void nonStaticContext() {
extracted();
}
private static void extracted() {
System.out.println("hi");
}
}

View File

@@ -397,6 +397,13 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() {
}
}
fun testExtractStaticDuplicateFromNonStaticContext(){
runAndRevertSettings {
JavaRefactoringSettings.getInstance().EXTRACT_STATIC_METHOD = false
doTest()
}
}
fun testRefactoringListener(){
templateTest {
configureByFile("$BASE_PATH/${getTestName(false)}.java")