From f3e4488e71f153a6b2b08367e461a1dd41cee167 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 3 May 2021 11:24:30 +0200 Subject: [PATCH] introduce parameter: show conflict if method won't be record accessor anymore (IDEA-267382) GitOrigin-RevId: 89340945fc0ab2907c59e65d90cf0b4755b5b219 --- .../IntroduceParameterProcessor.java | 10 ++++++++++ .../introduceParameter/beforeRecordGetterImpl.java | 5 +++++ .../java/refactoring/IntroduceParameterTest.java | 7 +++++++ .../messages/JavaRefactoringBundle.properties | 1 + 4 files changed, 23 insertions(+) create mode 100644 java/java-tests/testData/refactoring/introduceParameter/beforeRecordGetterImpl.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java index 04c04857a2dc..2428562b789d 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java @@ -17,6 +17,7 @@ import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.psi.search.searches.OverridingMethodsSearch; +import com.intellij.psi.util.JavaPsiRecordUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.IntroduceParameterRefactoring; @@ -253,6 +254,15 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem if (!myGenerateDelegate) { detectAccessibilityConflicts(usagesIn, conflicts); + if (myMethodToReplaceIn == myMethodToSearchFor) { + PsiRecordComponent recordComponent = JavaPsiRecordUtil.getRecordComponentForAccessor(myMethodToReplaceIn); + if (recordComponent != null) { + String message = JavaRefactoringBundle.message("0.will.no.longer.be.record.component.accessor", + RefactoringUIUtil.getDescription(myMethodToReplaceIn, true), + RefactoringUIUtil.getDescription(recordComponent, true)); + conflicts.putValue(myMethodToReplaceIn, message); + } + } } if (myParameterInitializer != null && !myMethodToReplaceIn.hasModifierProperty(PsiModifier.PRIVATE)) { diff --git a/java/java-tests/testData/refactoring/introduceParameter/beforeRecordGetterImpl.java b/java/java-tests/testData/refactoring/introduceParameter/beforeRecordGetterImpl.java new file mode 100644 index 000000000000..7fab5a91c78f --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/beforeRecordGetterImpl.java @@ -0,0 +1,5 @@ +record R(String name) { + String name() { + return "_" + name; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceParameterTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceParameterTest.java index 19795dec6465..f913ed2d1544 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceParameterTest.java @@ -15,6 +15,7 @@ import com.intellij.refactoring.introduceParameter.IntroduceParameterHandler; import com.intellij.refactoring.introduceParameter.IntroduceParameterProcessor; import com.intellij.refactoring.introduceParameter.Util; import com.intellij.refactoring.util.occurrences.ExpressionOccurrenceManager; +import com.intellij.testFramework.IdeaTestUtil; import com.intellij.testFramework.TestDataPath; import com.intellij.util.ui.UIUtil; import it.unimi.dsi.fastutil.ints.IntArrayList; @@ -164,6 +165,12 @@ public class IntroduceParameterTest extends LightRefactoringTestCase { doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, true, false, false); } + public void testRecordGetterImpl() { + IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_16, () -> + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, false, false, false, + "method R.name() will no longer be record component name getter")); + } + public void testParameterInFor() { configureByFile("/refactoring/introduceParameter/beforeParameterInFor.java"); performForLocal(true, true, true, false, false); diff --git a/java/openapi/resources/messages/JavaRefactoringBundle.properties b/java/openapi/resources/messages/JavaRefactoringBundle.properties index f456e384a830..61a480ecc75d 100644 --- a/java/openapi/resources/messages/JavaRefactoringBundle.properties +++ b/java/openapi/resources/messages/JavaRefactoringBundle.properties @@ -24,6 +24,7 @@ 0.will.become.inaccessible.from.1={0} will become inaccessible from {1} 0.will.hide.renamed.1={0} will hide renamed {1} 0.will.no.longer.override.1={0} will no longer override {1} +0.will.no.longer.be.record.component.accessor={0} will no longer be {1} getter 0.will.not.be.accessible.from.1.after.inlining={0} will not be accessible from {1} after inlining 0.will.override.renamed.1={0} will override renamed {1} a.package.local.class.0.will.no.longer.be.accessible.from.1=Package-local class {0} will no longer be accessible from {1}