From c44bcf028343e926a0c2d20615ff9659bd96e6ef Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Sat, 16 Aug 2025 16:54:06 +0200 Subject: [PATCH] Java: make Inline parameter Flexible Constructor Bodies aware (IDEA-377621) GitOrigin-RevId: ee720fecb1fb4c447188eab28090bc858d22119e --- .../InlineParameterExpressionProcessor.java | 10 +++--- .../FlexibleConstructorBody.java | 10 ++++++ .../FlexibleConstructorBody.java.after | 11 +++++++ .../inline/InlineParameterTest.java | 32 ++++++------------- 4 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineParameter/FlexibleConstructorBody.java create mode 100644 java/java-tests/testData/refactoring/inlineParameter/FlexibleConstructorBody.java.after diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java b/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java index 76606b7e375f..6b66cf1e35aa 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java @@ -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 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(); } diff --git a/java/java-tests/testData/refactoring/inlineParameter/FlexibleConstructorBody.java b/java/java-tests/testData/refactoring/inlineParameter/FlexibleConstructorBody.java new file mode 100644 index 000000000000..e0c9da3b9394 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/FlexibleConstructorBody.java @@ -0,0 +1,10 @@ +class CrashTestDummy { + public CrashTestDummy(String bar) { // inline the parameter + System.out.println(bar); + super(); + } + + public static void main(String[] args) { + new CrashTestDummy("bar".toString()); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineParameter/FlexibleConstructorBody.java.after b/java/java-tests/testData/refactoring/inlineParameter/FlexibleConstructorBody.java.after new file mode 100644 index 000000000000..3353aa1a4422 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/FlexibleConstructorBody.java.after @@ -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(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java index 47650f0cb700..238021e25a00 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java @@ -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 {