[extract method] IDEA-269072 IDEA-188743: reuse 'declare var type' option from 'introduce variable' refactoring

GitOrigin-RevId: 7a8f7a9eba3c7277da7b54e30a03afbbf771f84e
This commit is contained in:
Alexandr Suhinin
2023-04-21 10:58:34 +00:00
committed by intellij-monorepo-bot
parent 1d2c163976
commit 656b22fd2d
6 changed files with 68 additions and 5 deletions
@@ -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
}
@@ -0,0 +1,7 @@
class SomeClass {
public void test(String filePath) {
<selection>String s = "42";</selection>
System.out.println(s);
}
}
@@ -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;
}
}
@@ -0,0 +1,7 @@
class SomeClass {
public void test(String filePath) {
<selection>var s = "42";</selection>
System.out.println(s);
}
}
@@ -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;
}
}
@@ -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
}