mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
inline method to enum constant (IDEA-169658)
This commit is contained in:
@@ -55,6 +55,7 @@ import com.intellij.refactoring.rename.RenameJavaVariableProcessor;
|
||||
import com.intellij.refactoring.util.*;
|
||||
import com.intellij.usageView.UsageInfo;
|
||||
import com.intellij.usageView.UsageViewDescriptor;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.containers.HashMap;
|
||||
import com.intellij.util.containers.MultiMap;
|
||||
@@ -656,7 +657,24 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
|
||||
if (enumConstant != null) {
|
||||
PsiExpression returnExpr = getSimpleReturnedExpression(myMethod);
|
||||
if (returnExpr != null) {
|
||||
methodCall.replace(returnExpr);
|
||||
PsiElement copy = returnExpr.copy();
|
||||
copy.accept(new JavaRecursiveElementVisitor() {
|
||||
@Override
|
||||
public void visitReferenceExpression(PsiReferenceExpression expression) {
|
||||
super.visitReferenceExpression(expression);
|
||||
PsiElement resolve = expression.resolve();
|
||||
if (resolve instanceof PsiParameter) {
|
||||
int paramIdx = ArrayUtil.find(myMethod.getParameterList().getParameters(), resolve);
|
||||
if (paramIdx >= 0) {
|
||||
PsiExpression initializer = blockData.parmVars[paramIdx].getInitializer();
|
||||
if (initializer != null) {
|
||||
inlineInitializer((PsiVariable)resolve, initializer, expression);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
methodCall.replace(copy);
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -1037,39 +1055,43 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
|
||||
declareUsedLocalsFinal(initializer, strictlyFinal);
|
||||
}
|
||||
for (PsiReference ref : refs) {
|
||||
final PsiJavaCodeReferenceElement javaRef = (PsiJavaCodeReferenceElement)ref;
|
||||
if (initializer instanceof PsiThisExpression && ((PsiThisExpression)initializer).getQualifier() == null) {
|
||||
final PsiClass varThisClass = RefactoringChangeUtil.getThisClass(variable);
|
||||
if (RefactoringChangeUtil.getThisClass(javaRef) != varThisClass) {
|
||||
initializer = JavaPsiFacade.getInstance(myManager.getProject()).getElementFactory().createExpressionFromText(varThisClass.getName() + ".this", variable);
|
||||
}
|
||||
}
|
||||
|
||||
PsiExpression expr = InlineUtil.inlineVariable(variable, initializer, javaRef);
|
||||
|
||||
InlineUtil.tryToInlineArrayCreationForVarargs(expr);
|
||||
|
||||
//Q: move the following code to some util? (addition to inline?)
|
||||
if (expr instanceof PsiThisExpression) {
|
||||
if (expr.getParent() instanceof PsiReferenceExpression) {
|
||||
PsiReferenceExpression refExpr = (PsiReferenceExpression)expr.getParent();
|
||||
PsiElement refElement = refExpr.resolve();
|
||||
PsiExpression exprCopy = (PsiExpression)refExpr.copy();
|
||||
refExpr = (PsiReferenceExpression)refExpr.replace(myFactory.createExpressionFromText(refExpr.getReferenceName(), null));
|
||||
if (refElement != null) {
|
||||
PsiElement newRefElement = refExpr.resolve();
|
||||
if (!refElement.equals(newRefElement)) {
|
||||
// change back
|
||||
refExpr.replace(exprCopy);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
initializer = inlineInitializer(variable, initializer, (PsiJavaCodeReferenceElement)ref);
|
||||
}
|
||||
variable.getParent().delete();
|
||||
}
|
||||
}
|
||||
|
||||
private PsiExpression inlineInitializer(PsiVariable variable, PsiExpression initializer, PsiJavaCodeReferenceElement ref) {
|
||||
if (initializer instanceof PsiThisExpression && ((PsiThisExpression)initializer).getQualifier() == null) {
|
||||
final PsiClass varThisClass = RefactoringChangeUtil.getThisClass(variable);
|
||||
if (RefactoringChangeUtil.getThisClass(ref) != varThisClass) {
|
||||
initializer = JavaPsiFacade.getInstance(myManager.getProject()).getElementFactory().createExpressionFromText(varThisClass.getName() + ".this", variable);
|
||||
}
|
||||
}
|
||||
|
||||
PsiExpression expr = InlineUtil.inlineVariable(variable, initializer, ref);
|
||||
|
||||
InlineUtil.tryToInlineArrayCreationForVarargs(expr);
|
||||
|
||||
//Q: move the following code to some util? (addition to inline?)
|
||||
if (expr instanceof PsiThisExpression) {
|
||||
if (expr.getParent() instanceof PsiReferenceExpression) {
|
||||
PsiReferenceExpression refExpr = (PsiReferenceExpression)expr.getParent();
|
||||
PsiElement refElement = refExpr.resolve();
|
||||
PsiExpression exprCopy = (PsiExpression)refExpr.copy();
|
||||
refExpr = (PsiReferenceExpression)refExpr.replace(myFactory.createExpressionFromText(refExpr.getReferenceName(), null));
|
||||
if (refElement != null) {
|
||||
PsiElement newRefElement = refExpr.resolve();
|
||||
if (!refElement.equals(newRefElement)) {
|
||||
// change back
|
||||
refExpr.replace(exprCopy);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return initializer;
|
||||
}
|
||||
|
||||
private boolean canInlineParmOrThisVariable(PsiExpression initializer,
|
||||
boolean shouldBeFinal,
|
||||
boolean strictlyFinal,
|
||||
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
public class TestInlining {
|
||||
|
||||
static String inlineMe(String arg) {
|
||||
return arg.trim();
|
||||
}
|
||||
|
||||
public static final String FP = inlineMe("fa");
|
||||
|
||||
enum MyEnum {
|
||||
A(inlin<caret>eMe("foo"));
|
||||
|
||||
MyEnum(String s) {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
public class TestInlining {
|
||||
|
||||
public static final String FP = "fa".trim();
|
||||
|
||||
enum MyEnum {
|
||||
A("foo".trim());
|
||||
|
||||
MyEnum(String s) {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -145,6 +145,10 @@ public class InlineMethodTest extends LightRefactoringTestCase {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testEnumConstantConstructorWithArgs() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testConstantInChainingConstructor() throws Exception { // IDEADEV-28136
|
||||
doTest();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user