From e6233a181dee5f0ef87f5f4ab78935e99d34a6b6 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 14 Oct 2024 17:07:20 +0200 Subject: [PATCH] Java: better check that parameter is still available after inlining (IDEA-308977) GitOrigin-RevId: 4c9da5c574ed55e63dfef43d0d5dd655931533ee --- .../inline/InlineParameterExpressionProcessor.java | 1 + .../inlineParameter/CantInlineRecursive2.java | 13 +++++++++++++ .../refactoring/inline/InlineParameterTest.java | 9 +++++++++ 3 files changed, 23 insertions(+) create mode 100644 java/java-tests/testData/refactoring/inlineParameter/CantInlineRecursive2.java 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 701d400122e9..340fcf14d8b5 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 @@ -349,6 +349,7 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor } else if (element instanceof PsiParameter param && PsiTreeUtil.isAncestor(param.getDeclarationScope(), myInitializer, true)) { boolean bound = false; for (PsiParameter parameter : myMethod.getParameterList().getParameters()) { + if (parameter == myParameter) continue; if (parameter.getType().equals(param.getType()) && parameter.getName().equals(param.getName())) { bound = true; break; diff --git a/java/java-tests/testData/refactoring/inlineParameter/CantInlineRecursive2.java b/java/java-tests/testData/refactoring/inlineParameter/CantInlineRecursive2.java new file mode 100644 index 000000000000..f80fa91633c7 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/CantInlineRecursive2.java @@ -0,0 +1,13 @@ +import java.lang.Integer; +import java.util.*; +import java.util.ArrayList; + +public class Aphrodite { + + public void recursiveCountdown(Integer a){ + if (a == 1){ + return; + } + recursiveCountdown(a-1); + } +} 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 8aebbe721044..98a446b8cab0 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 @@ -302,6 +302,15 @@ public class InlineParameterTest extends LightRefactoringTestCase { assertEquals("Cannot find constant initializer for parameter", e.getMessage()); } } + + public void testCantInlineRecursive2() { + try { + doTest(false); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + assertEquals("Parameter initializer depends on caller's parameter a", e.getMessage()); + } + } public void testParameterDefWithWriteAccess() { try {