diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/CallBuilder.kt b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/CallBuilder.kt index e92cde70e2ec..47c1a48b10a1 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/CallBuilder.kt +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/CallBuilder.kt @@ -5,6 +5,8 @@ import com.intellij.psi.* import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.psi.impl.source.resolve.JavaResolveUtil import com.intellij.psi.util.PsiUtil +import com.intellij.refactoring.IntroduceVariableUtil +import com.intellij.refactoring.JavaRefactoringSettings import com.intellij.refactoring.extractMethod.newImpl.ExtractMethodHelper.createDeclaration import com.intellij.refactoring.extractMethod.newImpl.structures.DataOutput import com.intellij.refactoring.extractMethod.newImpl.structures.DataOutput.* @@ -12,7 +14,6 @@ import com.intellij.refactoring.extractMethod.newImpl.structures.ExtractOptions import com.intellij.refactoring.extractMethod.newImpl.structures.FlowOutput import com.intellij.refactoring.extractMethod.newImpl.structures.FlowOutput.* import com.intellij.refactoring.util.RefactoringChangeUtil - class CallBuilder(private val context: PsiElement) { private val factory: PsiElementFactory = PsiElementFactory.getInstance(context.project) @@ -37,9 +38,16 @@ class CallBuilder(private val context: PsiElement) { } val declarationStatement = declaration as? PsiDeclarationStatement val declaredVariable = declarationStatement?.declaredElements?.firstOrNull() as? PsiVariable - if (dataOutput is VariableOutput && declaredVariable != null) { - val needsFinal = dataOutput.variable.hasModifierProperty(PsiModifier.FINAL) - PsiUtil.setModifierProperty(declaredVariable, PsiModifier.FINAL, needsFinal) + if (declaredVariable != null) { + val settings = JavaRefactoringSettings.getInstance() + val outputVariable = (dataOutput as? VariableOutput)?.variable + val declareFinal = outputVariable?.hasModifierProperty(PsiModifier.FINAL) == true || settings.INTRODUCE_LOCAL_CREATE_FINALS == true + PsiUtil.setModifierProperty(declaredVariable, PsiModifier.FINAL, declareFinal) + + val isInferredVar = outputVariable?.typeElement?.isInferredType == true + if (isInferredVar || PsiUtil.isLanguageLevel10OrHigher(context) && settings.INTRODUCE_LOCAL_CREATE_VAR_TYPE == true) { + IntroduceVariableUtil.expandDiamondsAndReplaceExplicitTypeWithVar(declaredVariable.typeElement, declaredVariable) + } } return listOfNotNull(declaration) } @@ -108,7 +116,7 @@ class CallBuilder(private val context: PsiElement) { factory.createReferenceExpression(methodClass) } else { - RefactoringChangeUtil.createThisExpression(PsiManager.getInstance(method.project), methodClass) + RefactoringChangeUtil.createThisExpression(method.manager, methodClass) } callElement.methodExpression.qualifierExpression = ref } diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DeclareVarType.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DeclareVarType.java new file mode 100644 index 000000000000..9c9d3b33add1 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DeclareVarType.java @@ -0,0 +1,7 @@ +class SomeClass { + + public void test(String filePath) { + String s = "42"; + System.out.println(s); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DeclareVarType_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DeclareVarType_after.java new file mode 100644 index 000000000000..77487e2fc3ea --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/DeclareVarType_after.java @@ -0,0 +1,15 @@ +import org.jetbrains.annotations.NotNull; + +class SomeClass { + + public void test(String filePath) { + var s = getString(); + System.out.println(s); + } + + @NotNull + private static String getString() { + String s = "42"; + return s; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/KeepVarKeyword.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/KeepVarKeyword.java new file mode 100644 index 000000000000..3851ac450c87 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/KeepVarKeyword.java @@ -0,0 +1,7 @@ +class SomeClass { + + public void test(String filePath) { + var s = "42"; + System.out.println(s); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/KeepVarKeyword_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/KeepVarKeyword_after.java new file mode 100644 index 000000000000..3a0b60625706 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/KeepVarKeyword_after.java @@ -0,0 +1,15 @@ +import org.jetbrains.annotations.NotNull; + +class SomeClass { + + public void test(String filePath) { + var s = getString(); + System.out.println(s); + } + + @NotNull + private static String getString() { + var s = "42"; + return s; + } +} \ 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 ff10d1ad9f7c..9e84e3b5116c 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt @@ -520,6 +520,15 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() { doTest() } + fun testKeepVarKeyword(){ + doTest() + } + + fun testDeclareVarType(){ + JavaRefactoringSettings.getInstance().INTRODUCE_LOCAL_CREATE_VAR_TYPE = true + doTest() + } + fun testRefactoringListener(){ templateTest { configureByFile("$BASE_PATH/${getTestName(false)}.java") @@ -566,11 +575,13 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() { val settings = JavaRefactoringSettings.getInstance() val defaultStatic = settings.EXTRACT_STATIC_METHOD val defaultPassFields = settings.EXTRACT_STATIC_METHOD_AND_PASS_FIELDS + val defaultDeclareVar = settings.INTRODUCE_LOCAL_CREATE_VAR_TYPE val defaultChangeSignature = DuplicatesMethodExtractor.changeSignatureDefault val defaultReplaceDuplicates = DuplicatesMethodExtractor.replaceDuplicatesDefault Disposer.register(testRootDisposable) { settings.EXTRACT_STATIC_METHOD = defaultStatic settings.EXTRACT_STATIC_METHOD_AND_PASS_FIELDS = defaultPassFields + settings.INTRODUCE_LOCAL_CREATE_VAR_TYPE = defaultDeclareVar DuplicatesMethodExtractor.changeSignatureDefault = defaultChangeSignature DuplicatesMethodExtractor.replaceDuplicatesDefault = defaultReplaceDuplicates }