diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java index b0830b2f2188..fb1b9c7369bc 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java @@ -14,6 +14,7 @@ import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.controlFlow.ControlFlowUtil; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.search.searches.OverridingMethodsSearch; +import com.intellij.psi.util.JavaPsiRecordUtil; import com.intellij.psi.util.PropertyUtilBase; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; @@ -133,11 +134,22 @@ public class RenameJavaVariableProcessor extends RenameJavaMemberProcessor { if (element instanceof PsiRecordComponent) { PsiClass containingClass = ((PsiRecordComponent)element).getContainingClass(); if (containingClass != null) { - PsiMethod explicitGetter = ContainerUtil - .find(containingClass.findMethodsByName(((PsiRecordComponent)element).getName(), false), m -> m.getParameters().length == 0); + String name = ((PsiRecordComponent)element).getName(); + if (name != null) { + PsiMethod explicitGetter = ContainerUtil + .find(containingClass.findMethodsByName(name, false), m -> m.getParameters().length == 0); - if (explicitGetter != null) { - addOverriddenAndImplemented(explicitGetter, newName, null, newName, JavaCodeStyleManager.getInstance(element.getProject()), allRenames); + if (explicitGetter != null) { + addOverriddenAndImplemented(explicitGetter, newName, null, newName, JavaCodeStyleManager.getInstance(element.getProject()), allRenames); + } + + PsiMethod canonicalConstructor = ContainerUtil.find(containingClass.getConstructors(), c -> JavaPsiRecordUtil.isExplicitCanonicalConstructor(c)); + if (canonicalConstructor != null) { + PsiParameter parameter = ContainerUtil.find(canonicalConstructor.getParameterList().getParameters(), p -> name.equals(p.getName())); + if (parameter != null) { + allRenames.put(parameter, newName); + } + } } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingRecords/RenameWithCanonicalConstructor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingRecords/RenameWithCanonicalConstructor.java new file mode 100644 index 000000000000..b424b9ad648a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingRecords/RenameWithCanonicalConstructor.java @@ -0,0 +1,10 @@ +record Foo(int bar, int foo) { + public Foo(int bar, int foo) { + this.bar = bar; + this.foo = foo; + } + + Foo(int bar) { + this(bar, 0); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingRecords/RenameWithCanonicalConstructor_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingRecords/RenameWithCanonicalConstructor_after.java new file mode 100644 index 000000000000..e168ba89dfdf --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingRecords/RenameWithCanonicalConstructor_after.java @@ -0,0 +1,10 @@ +record Foo(int baz, int foo) { + public Foo(int baz, int foo) { + this.baz = baz; + this.foo = foo; + } + + Foo(int bar) { + this(bar, 0); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightRecordsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightRecordsHighlightingTest.java index 0aef876010b0..b98466974701 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightRecordsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightRecordsHighlightingTest.java @@ -46,6 +46,10 @@ public class LightRecordsHighlightingTest extends LightJavaCodeInsightFixtureTes doTestRename(); } + public void testRenameWithCanonicalConstructor() { + doTestRename(); + } + private void doTestRename() { doTest(); myFixture.renameElementAtCaret("baz");