Java: make Inline parameter Flexible Constructor Bodies aware (IDEA-377621)

GitOrigin-RevId: ee720fecb1fb4c447188eab28090bc858d22119e
This commit is contained in:
Bas Leijdekkers
2025-08-19 09:09:25 +00:00
committed by intellij-monorepo-bot
parent 40d25dbdc3
commit c44bcf0283
4 changed files with 35 additions and 28 deletions
@@ -7,6 +7,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.pom.java.JavaFeature;
import com.intellij.psi.*;
import com.intellij.psi.controlFlow.DefUseUtil;
import com.intellij.psi.search.searches.ReferencesSearch;
@@ -136,11 +137,10 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor
}
}
final PsiParameter[] parameters = myMethod.getParameterList().getParameters();
final List<ParameterInfoImpl> psiParameters = new ArrayList<>();
int paramIdx = 0;
final String paramName = myParameter.getName();
for (PsiParameter param : parameters) {
for (PsiParameter param : myMethod.getParameterList().getParameters()) {
if (!Comparing.strEqual(paramName, param.getName())) {
psiParameters.add(ParameterInfoImpl.create(paramIdx).withName(param.getName()).withType(param.getType()));
}
@@ -291,9 +291,9 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor
}
private @Nullable PsiElement findAnchorForLocalVariableDeclaration(PsiCodeBlock body) {
PsiMethodCallExpression call = JavaPsiConstructorUtil.findThisOrSuperCallInConstructor(myMethod);
if (call != null) {
return call.getParent();
if (!JavaFeature.STATEMENTS_BEFORE_SUPER.isSufficient(PsiUtil.getLanguageLevel(body))) {
PsiMethodCallExpression call = JavaPsiConstructorUtil.findThisOrSuperCallInConstructor(myMethod);
if (call != null) return call.getParent();
}
return body.getLBrace();
}
@@ -0,0 +1,10 @@
class CrashTestDummy {
public CrashTestDummy(String bar<caret>) { // inline the parameter
System.out.println(bar);
super();
}
public static void main(String[] args) {
new CrashTestDummy("bar".toString());
}
}
@@ -0,0 +1,11 @@
class CrashTestDummy {
public CrashTestDummy() {
String bar = "bar".toString(); // inline the parameter
System.out.println(bar);
super();
}
public static void main(String[] args) {
new CrashTestDummy();
}
}
@@ -4,11 +4,13 @@ package com.intellij.java.refactoring.inline;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.TargetElementUtil;
import com.intellij.java.refactoring.LightRefactoringTestCase;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.BaseRefactoringProcessor;
import com.intellij.refactoring.inline.InlineParameterExpressionProcessor;
import com.intellij.refactoring.inline.InlineParameterHandler;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.testFramework.IdeaTestUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -137,29 +139,13 @@ public class InlineParameterTest extends LightRefactoringTestCase {
}
}
public void testRightSideAssignment() {
doTest(false);
}
public void testRefNewInnerForMethod() {
doTest(false);
}
public void testRefNewInnerAvailable() {
doTest(false);
}
public void testLocalVarDeclarationInConstructor() {
doTest(true);
}
public void testFromClassInitializer() {
doTest(false);
}
public void testPropagatedParams() {
doTest(false);
}
public void testRightSideAssignment() { doTest(false); }
public void testRefNewInnerForMethod() { doTest(false); }
public void testRefNewInnerAvailable() { doTest(false); }
public void testLocalVarDeclarationInConstructor() { IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_1_8, () -> doTest(true)); }
public void testFlexibleConstructorBody() { doTest(true); }
public void testFromClassInitializer() { doTest(false); }
public void testPropagatedParams() { doTest(false); }
public void testParameterWithWriteAccess() {
try {