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 2428562b789d..b3c1c4942d58 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java @@ -262,6 +262,10 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem RefactoringUIUtil.getDescription(recordComponent, true)); conflicts.putValue(myMethodToReplaceIn, message); } + else if (JavaPsiRecordUtil.isCanonicalConstructor(myMethodToReplaceIn)) { + String message = JavaRefactoringBundle.message("0.will.no.longer.be.canonical.constructor"); + conflicts.putValue(myMethodToReplaceIn, message); + } } } diff --git a/java/java-tests/testData/refactoring/introduceParameter/beforeCanonicalConstructor.java b/java/java-tests/testData/refactoring/introduceParameter/beforeCanonicalConstructor.java new file mode 100644 index 000000000000..3cb945ba4b61 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/beforeCanonicalConstructor.java @@ -0,0 +1,6 @@ +record R(String name) { + R(String name) { + "_" + name; + this.name = 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 f913ed2d1544..6ac5c2129a7f 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceParameterTest.java @@ -171,6 +171,12 @@ public class IntroduceParameterTest extends LightRefactoringTestCase { "method R.name() will no longer be record component name getter")); } + public void testCanonicalConstructor() { + IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_16, () -> + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, false, false, false, + "Constructor will no longer be canonical")); + } + 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 61a480ecc75d..ce2b6e765159 100644 --- a/java/openapi/resources/messages/JavaRefactoringBundle.properties +++ b/java/openapi/resources/messages/JavaRefactoringBundle.properties @@ -25,6 +25,7 @@ 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.no.longer.be.canonical.constructor=Constructor will no longer be canonical 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}