From a0aaa369c99ca833df0c6e940fee36ec353c1f40 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 25 Apr 2024 17:04:54 +0200 Subject: [PATCH] java: preserve comments on "Replace constructor with factory method" GitOrigin-RevId: b2a8ab6923c29f5f35e50acdf30aa1acc897c844 --- .../ReplaceConstructorWithFactoryAction.java | 9 ++++++--- .../afterPreserveComments.java | 17 +++++++++++++++++ .../beforePreserveComments.java | 6 ++++++ .../ReplaceConstructorWithFactoryTest.java | 3 ++- 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithFactory/afterPreserveComments.java create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforePreserveComments.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/ReplaceConstructorWithFactoryAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/ReplaceConstructorWithFactoryAction.java index 828b42d8fe74..3761cf15f5a8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/ReplaceConstructorWithFactoryAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/ReplaceConstructorWithFactoryAction.java @@ -21,6 +21,7 @@ import com.intellij.util.ObjectUtils; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.psiutils.ClassUtils; +import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.MethodUtils; import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; @@ -115,9 +116,11 @@ public final class ReplaceConstructorWithFactoryAction implements ModCommandActi for (PsiNewExpression newExpression : writableUsages) { var factoryCall = (PsiMethodCallExpression)factory.createExpressionFromText(factoryName + "()", newExpression); - factoryCall.getArgumentList().replace(Objects.requireNonNull(newExpression.getArgumentList())); + CommentTracker ct = new CommentTracker(); + + factoryCall.getArgumentList().replace(Objects.requireNonNull(ct.markUnchanged(newExpression.getArgumentList()))); - PsiExpression newQualifier = newExpression.getQualifier(); + PsiExpression newQualifier = ct.markUnchanged(newExpression.getQualifier()); PsiReferenceExpression factoryCallRef = factoryCall.getMethodExpression(); PsiElement resolvedFactoryMethod = factoryCallRef.resolve(); @@ -127,7 +130,7 @@ public final class ReplaceConstructorWithFactoryAction implements ModCommandActi Objects.requireNonNull(factoryCallRef.getQualifierExpression()).replace(qualifier); } - newExpression.replace(factoryCall); + ct.replaceAndRestoreComments(newExpression, factoryCall); } updater.rename(factoryMethod, names); } diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithFactory/afterPreserveComments.java b/java/java-tests/testData/refactoring/replaceConstructorWithFactory/afterPreserveComments.java new file mode 100644 index 000000000000..eb1f854b8b5b --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithFactory/afterPreserveComments.java @@ -0,0 +1,17 @@ +class Used { + Inner createInner() { + return new Inner(); + } + + class Inner { + private Inner() { + } + } + public static void main(String[] args) { + /*2*/ + /*3*/ + /*4*/ + /*5*/ + new /*1*/Used().createInner(/*6*/)/*7*/; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforePreserveComments.java b/java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforePreserveComments.java new file mode 100644 index 000000000000..79014dc27b0e --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforePreserveComments.java @@ -0,0 +1,6 @@ +class Used { + class Inner {} + public static void main(String[] args) { + new /*1*/Used()/*2*/./*3*/new /*4*/Inner/*5*/(/*6*/)/*7*/; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ReplaceConstructorWithFactoryTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/ReplaceConstructorWithFactoryTest.java index 30288ef05c4a..9d63c90c7e5f 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ReplaceConstructorWithFactoryTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ReplaceConstructorWithFactoryTest.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.java.refactoring; import com.intellij.JavaTestUtil; @@ -59,6 +59,7 @@ public class ReplaceConstructorWithFactoryTest extends LightRefactoringTestCase public void testDefaultConstructor() { runTest("03", null); } public void testDefaultConstructorWithTypeParams() { runTest("TypeParams", null); } + public void testPreserveComments() { runTest(getTestName(false), null); } public void testInnerClass() { runTest("04", null); }