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
}