mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
InlineMethodProcessor#inlineMethodCall: fix initializer inlining for trivial method body (IDEA-220028)
GitOrigin-RevId: 3bbc430022e3933aaa89b31689a121b9617f25ba
This commit is contained in:
committed by
intellij-monorepo-bot
parent
2d5f1dc816
commit
249410f100
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user