diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateEqualsHelper.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateEqualsHelper.java index 5f427ac84851..fa1bd977f7ae 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateEqualsHelper.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateEqualsHelper.java @@ -179,9 +179,7 @@ public class GenerateEqualsHelper implements Runnable { final MethodSignature equalsSignature = getEqualsSignature(myProject, myClass.getResolveScope()); PsiMethod superEquals = MethodSignatureUtil.findMethodBySignature(myClass, equalsSignature, true); - if (superEquals != null) { - contextMap.put(SUPER_PARAM_NAME, superEquals.getParameterList().getParameters()[0].getName()); - } + contextMap.put(SUPER_PARAM_NAME, superEquals == null ? "obj" : superEquals.getParameterList().getParameters()[0].getName()); contextMap.put(SUPER_HAS_EQUALS, superMethodExists(equalsSignature)); contextMap.put(CHECK_PARAMETER_WITH_INSTANCEOF, myCheckParameterWithInstanceof); diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterRecordUseGettersJava21.java b/java/java-tests/testData/codeInsight/generateEquals/afterRecordUseGettersJava21.java new file mode 100644 index 000000000000..92e8db1e57b5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateEquals/afterRecordUseGettersJava21.java @@ -0,0 +1,19 @@ + +record Point(int x, int y, int z) { + + public final boolean equals(Object o) { + if (!(o instanceof Point)) return false; + if (!super.equals(o)) return false; + + final Point point = (Point) o; + return x() == point.x() && y() == point.y() && z() == point.z(); + } + + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + x(); + result = 31 * result + y(); + result = 31 * result + z(); + return result; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/generateEquals/beforeRecordUseGettersJava21.java b/java/java-tests/testData/codeInsight/generateEquals/beforeRecordUseGettersJava21.java new file mode 100644 index 000000000000..38bf9b80417e --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateEquals/beforeRecordUseGettersJava21.java @@ -0,0 +1,4 @@ + +record Point(int x, int y, int z) { + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateEqualsTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateEqualsTest.java index 8a417c2ba7b5..5086c752469e 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateEqualsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateEqualsTest.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.codeInsight; import com.intellij.application.options.CodeStyle; @@ -108,6 +108,10 @@ public class GenerateEqualsTest extends LightJavaCodeInsightTestCase { public void testDifferentTypesGetters() { doTest(Function.identity(), Function.identity(), fields -> PsiField.EMPTY_ARRAY, true, true, false); } + + public void testRecordUseGettersJava21() { + doTest(Function.identity(), Function.identity(), fields -> PsiField.EMPTY_ARRAY, true, true, true); + } public void testDifferentTypesAllNotNull() { doTestWithTemplate(EqualsHashCodeTemplatesManager.INTELLI_J_DEFAULT); diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java index 482c0749abca..62b68809500c 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java @@ -89,12 +89,21 @@ public final class ElementFactory { public static FieldElement newFieldElement(PsiField field, boolean useAccessor) { FieldElement fe = new FieldElement(); fe.setName(field.getName()); - final PsiMethod getterForField = useAccessor ? PropertyUtilBase.findGetterForField(field) : null; + PsiRecordComponent component = JavaPsiRecordUtil.getComponentForField(field); + final PsiMethod getterForField; + if (useAccessor) { + getterForField = component != null + ? JavaPsiRecordUtil.getAccessorForRecordComponent(component) + : PropertyUtilBase.findGetterForField(field); + } + else { + getterForField = null; + } fe.setAccessor(getterForField != null ? getterForField.getName() + "()" : field.getName()); if (PsiAdapter.isConstantField(field)) fe.setConstant(true); if (PsiAdapter.isEnumField(field)) fe.setEnum(true); - if (JavaPsiRecordUtil.getComponentForField(field) != null) fe.setRecordComponent(true); + if (component != null) fe.setRecordComponent(true); PsiModifierList modifiers = field.getModifierList(); if (modifiers != null) { if (modifiers.hasModifierProperty(PsiModifier.TRANSIENT)) fe.setModifierTransient(true);