From 90543d0e2415983772165b9f20dbb98ec567f4ac Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 31 Jul 2024 12:32:07 +0200 Subject: [PATCH] [java-inspections] InlineVariableFix: avoid PSI writes after highlighting Highlighting causes PSI commit and reformatting. It looks like modifying PSI after that may cause problems. Probably we can fix it later in ModCommand API, but for now we can just reorder things. Fixes IDEA-355992 "Inline variable" quick-fix doesn't work if the variable initializer is on the next line GitOrigin-RevId: f0a2418ac5618f91291b1f74ad2168d26c612447 --- .../src/com/siyeh/ig/fixes/InlineVariableFix.java | 13 ++++++++++--- .../igfixes/inline/NewLineInInitializer.after.java | 10 ++++++++++ .../siyeh/igfixes/inline/NewLineInInitializer.java | 12 ++++++++++++ .../com/siyeh/ig/fixes/InlineVariableFixTest.java | 1 + 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/ig/com/siyeh/igfixes/inline/NewLineInInitializer.after.java create mode 100644 java/java-tests/testData/ig/com/siyeh/igfixes/inline/NewLineInInitializer.java diff --git a/java/java-impl/src/com/siyeh/ig/fixes/InlineVariableFix.java b/java/java-impl/src/com/siyeh/ig/fixes/InlineVariableFix.java index 540a97acc879..6a7e8cbc28aa 100644 --- a/java/java-impl/src/com/siyeh/ig/fixes/InlineVariableFix.java +++ b/java/java-impl/src/com/siyeh/ig/fixes/InlineVariableFix.java @@ -54,9 +54,16 @@ public class InlineVariableFix extends PsiUpdateModCommandQuickFix { replacedElements.add(expression); } - for (PsiElement element : replacedElements) { - updater.highlight(element); - } new CommentTracker().deleteAndRestoreComments(variable); + boolean positioned = false; + for (PsiElement element : replacedElements) { + if (element.isValid()) { + updater.highlight(element); + if (!positioned) { + positioned = true; + updater.moveCaretTo(element); + } + } + } } } \ No newline at end of file diff --git a/java/java-tests/testData/ig/com/siyeh/igfixes/inline/NewLineInInitializer.after.java b/java/java-tests/testData/ig/com/siyeh/igfixes/inline/NewLineInInitializer.after.java new file mode 100644 index 000000000000..f8f11f3e6838 --- /dev/null +++ b/java/java-tests/testData/ig/com/siyeh/igfixes/inline/NewLineInInitializer.after.java @@ -0,0 +1,10 @@ +import java.util.List; + +public class Demo { + List test(List list) { + return list.stream() + .map(String::toUpperCase) + .map(String::trim) + .toList(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/ig/com/siyeh/igfixes/inline/NewLineInInitializer.java b/java/java-tests/testData/ig/com/siyeh/igfixes/inline/NewLineInInitializer.java new file mode 100644 index 000000000000..185887f6c4be --- /dev/null +++ b/java/java-tests/testData/ig/com/siyeh/igfixes/inline/NewLineInInitializer.java @@ -0,0 +1,12 @@ +import java.util.List; + +public class Demo { + List test(List list) { + List result = + list.stream() + .map(String::toUpperCase) + .map(String::trim) + .toList(); + return result; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/siyeh/ig/fixes/InlineVariableFixTest.java b/java/java-tests/testSrc/com/siyeh/ig/fixes/InlineVariableFixTest.java index 10b9c85e93d5..3028113130c3 100644 --- a/java/java-tests/testSrc/com/siyeh/ig/fixes/InlineVariableFixTest.java +++ b/java/java-tests/testSrc/com/siyeh/ig/fixes/InlineVariableFixTest.java @@ -21,4 +21,5 @@ public class InlineVariableFixTest extends IGQuickFixesTestCase { public void testArrayInitializer() { doTest(); } public void testCastForOverloads() { assertQuickfixNotAvailable(); } public void testComment() { doTest(); } + public void testNewLineInInitializer() { doTest(); } }