From e8b723c468a891485950dbe751d591cc148a65a9 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 26 Apr 2024 11:49:59 +0200 Subject: [PATCH] [java-refactoring] Inline local: go specifically one level up when searching for PsiReferenceExpression Otherwise, it's possible to find something unrelated, e.g., if you are inside the lambda Fixes IDEA-351780 Inline Local Variable inside lambda fails with error GitOrigin-RevId: 8f0378975da117dfbc7086a67dac6fa6c9533a67 --- .../refactoring/inline/InlineLocalHandler.java | 10 +++++----- .../testData/refactoring/inlineLocal/InLambda.java | 13 +++++++++++++ .../refactoring/inlineLocal/InLambda.java.after | 12 ++++++++++++ .../java/refactoring/inline/InlineLocalTest.java | 4 ++++ 4 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineLocal/InLambda.java create mode 100644 java/java-tests/testData/refactoring/inlineLocal/InLambda.java.after diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineLocalHandler.java b/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineLocalHandler.java index ecfe679fc648..5f6bbadae4ff 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineLocalHandler.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineLocalHandler.java @@ -32,6 +32,7 @@ import com.intellij.refactoring.util.InlineUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.CommonJavaRefactoringUtil; +import com.intellij.util.ObjectUtils; import com.intellij.util.PlatformUtils; import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.PsiReplacementUtil; @@ -96,11 +97,10 @@ public final class InlineLocalHandler extends JavaInlineActionHandler { } private static @NotNull ModCommand perform(ActionContext context) { - PsiElement element = context.findLeaf(); - if (!(element instanceof PsiIdentifier)) { - element = context.findLeafOnTheLeft(); - } - final PsiReferenceExpression refExpr = PsiTreeUtil.getParentOfType(element, PsiReferenceExpression.class); + PsiElement parent = context.findLeaf() instanceof PsiIdentifier id ? id.getParent() : + context.findLeafOnTheLeft() instanceof PsiIdentifier id ? id.getParent() : + null; + final PsiReferenceExpression refExpr = ObjectUtils.tryCast(parent, PsiReferenceExpression.class); InlineMode mode; if (refExpr != null && PlatformUtils.isFleetBackend() && JavaRefactoringSettings.getInstance().INLINE_LOCAL_THIS) { // Conflicts mode is handled separately in Fleet, for now diff --git a/java/java-tests/testData/refactoring/inlineLocal/InLambda.java b/java/java-tests/testData/refactoring/inlineLocal/InLambda.java new file mode 100644 index 000000000000..30ff1c7621b1 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/InLambda.java @@ -0,0 +1,13 @@ +import java.util.Collection; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public final class InlineTest { + public List foo(Collection bars, Predicate filter) { + return bars.stream().filter(bar -> { + final String searchString = bar.toString(); + return filter.test(searchString); + }).collect(Collectors.toList()); + } +} diff --git a/java/java-tests/testData/refactoring/inlineLocal/InLambda.java.after b/java/java-tests/testData/refactoring/inlineLocal/InLambda.java.after new file mode 100644 index 000000000000..487227136fb7 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/InLambda.java.after @@ -0,0 +1,12 @@ +import java.util.Collection; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public final class InlineTest { + public List foo(Collection bars, Predicate filter) { + return bars.stream().filter(bar -> { + return filter.test(bar.toString()); + }).collect(Collectors.toList()); + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineLocalTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineLocalTest.java index 8c7da419f050..f40f0a8ae4f9 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineLocalTest.java @@ -381,6 +381,10 @@ public class InlineLocalTest extends LightJavaCodeInsightTestCase { JavaRefactoringSettings.getInstance().INLINE_LOCAL_THIS = initialSetting; } } + + public void testInLambda() { + doTest(LanguageLevel.JDK_1_8); + } private void doTest() { doTest(LanguageLevel.JDK_1_7);