InlineMethodProcessor#inlineMethodCall: fix initializer inlining for trivial method body (IDEA-220028)

GitOrigin-RevId: 3bbc430022e3933aaa89b31689a121b9617f25ba
This commit is contained in:
Tagir Valeev
2019-08-08 07:04:01 +03:00
committed by intellij-monorepo-bot
parent 2d5f1dc816
commit 249410f100
4 changed files with 51 additions and 15 deletions
@@ -627,22 +627,17 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
ChangeContextUtil.encodeContextInfo(returnExpr, true);
PsiElement copy = returnExpr.copy();
ChangeContextUtil.clearContextInfo(returnExpr);
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);
}
}
if (copy instanceof PsiReferenceExpression && ((PsiReferenceExpression)copy).getQualifierExpression() == null) {
copy = inlineParameterReference((PsiReferenceExpression)copy, blockData);
} else {
copy.accept(new JavaRecursiveElementVisitor() {
@Override
public void visitReferenceExpression(PsiReferenceExpression expression) {
super.visitReferenceExpression(expression);
inlineParameterReference(expression, blockData);
}
}
});
});
}
PsiElement replace = methodCall.replace(copy);
if (blockData.thisVar != null) {
ChangeContextUtil.decodeContextInfo(replace, myMethod.getContainingClass(), blockData.thisVar.getInitializer());
@@ -744,6 +739,18 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
ChangeContextUtil.clearContextInfo(anchorParent);
}
@NotNull
private PsiExpression inlineParameterReference(@NotNull PsiReferenceExpression expression, BlockData blockData) {
if (expression.getQualifierExpression() != null) return expression;
PsiElement resolve = expression.resolve();
if (!(resolve instanceof PsiParameter)) return expression;
int paramIdx = ArrayUtil.find(myMethod.getParameterList().getParameters(), resolve);
if (paramIdx < 0) return expression;
PsiExpression initializer = blockData.parmVars[paramIdx].getInitializer();
if (initializer == null) return expression;
return inlineInitializer((PsiVariable)resolve, initializer, expression);
}
private PsiSubstitutor getCallSubstitutor(PsiMethodCallExpression methodCall) {
JavaResolveResult resolveResult = methodCall.getMethodExpression().advancedResolve(false);
if (myMethod.isPhysical()) {
@@ -0,0 +1,14 @@
enum A {
A(foo("a")),
B(foo("b")),
C(foo("c")),
;
A(final String c) {
}
private static String f<caret>oo(String x) {
return x;
}
}
@@ -0,0 +1,11 @@
enum A {
A("a"),
B("b"),
C("c"),
;
A(final String c) {
}
}
@@ -539,6 +539,10 @@ public class InlineMethodTest extends LightRefactoringTestCase {
doTest();
}
public void testEnumStaticMethod() {
doTest();
}
@Override
protected Sdk getProjectJDK() {
return getTestName(false).contains("Src") ? IdeaTestUtil.getMockJdk17() : super.getProjectJDK();