From 655bf65a7d6eb5c7cb04c220781e795ddad9982e Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 2 Aug 2024 14:13:37 +0200 Subject: [PATCH] [java-refactoring] Inline variable: ignore references from method calls Fixes IDEA-356914 Exception in Inline variable on red code GitOrigin-RevId: ca785f72ba4b99fed0a0f3410a21df7dd13b7c5a --- .../intellij/refactoring/inline/InlineLocalHandler.java | 2 ++ .../refactoring/inlineLocal/LambdaInitialization.java | 8 ++++++++ .../inlineLocal/LambdaInitialization.java.after | 7 +++++++ .../intellij/java/refactoring/inline/InlineLocalTest.java | 2 ++ 4 files changed, 19 insertions(+) create mode 100644 java/java-tests/testData/refactoring/inlineLocal/LambdaInitialization.java create mode 100644 java/java-tests/testData/refactoring/inlineLocal/LambdaInitialization.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 7612c072cbac..c263df942838 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 @@ -374,6 +374,8 @@ public final class InlineLocalHandler extends JavaInlineActionHandler { final SmartPointerManager pointerManager = SmartPointerManager.getInstance(project); for (PsiElement element : refsToInline) { PsiJavaCodeReferenceElement refElement = (PsiJavaCodeReferenceElement)element; + // Erroneous method call which is resolved to a local variable: simply skip it, otherwise we may create incorrect PSI + if (refElement.getParent() instanceof PsiMethodCallExpression) continue; pointers.add(pointerManager.createSmartPsiElementPointer(InlineUtil.inlineVariable(local, defToInline, refElement))); } return pointers; diff --git a/java/java-tests/testData/refactoring/inlineLocal/LambdaInitialization.java b/java/java-tests/testData/refactoring/inlineLocal/LambdaInitialization.java new file mode 100644 index 000000000000..691c9a0c5270 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/LambdaInitialization.java @@ -0,0 +1,8 @@ +public class LambdaInitialization { + Runnable foo() { + Runnable s = () -> { + s(); + }; + return s; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineLocal/LambdaInitialization.java.after b/java/java-tests/testData/refactoring/inlineLocal/LambdaInitialization.java.after new file mode 100644 index 000000000000..ca649168c22f --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/LambdaInitialization.java.after @@ -0,0 +1,7 @@ +public class LambdaInitialization { + Runnable foo() { + return () -> { + s(); + }; + } +} \ No newline at end of file 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 110b053286e3..1c64fcd7fe0d 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 @@ -356,6 +356,8 @@ public class InlineLocalTest extends LightJavaCodeInsightTestCase { public void testCompositeAssignment() { doTest(); } public void testCompositeAssignmentCast() { doTest(); } + + public void testLambdaInitialization() { doTest(); } private void doTest(String conflictMessage) { try {