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}