From 1e53d86ca56ac2ace8733d03dae449feb115796d Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 17 Mar 2021 10:02:05 +0700 Subject: [PATCH] [java-inspections] EqualsAndHashcode: do not report Java records that have hashCode but no equals (IDEA-264394) GitOrigin-RevId: 15f83c984ebb807f9966407bf03a7e402c3ffded --- .../equalsAndHashcode/EqualsAndHashcodeBase.java | 4 ++++ .../equalsAndHashcode/record/expected.xml | 2 ++ .../equalsAndHashcode/record/src/Pixel.java | 13 +++++++++++++ .../java/codeInspection/EqualsAndHashCodeTest.java | 10 ++++++++++ 4 files changed, 29 insertions(+) create mode 100644 java/java-tests/testData/inspection/equalsAndHashcode/record/expected.xml create mode 100644 java/java-tests/testData/inspection/equalsAndHashcode/record/src/Pixel.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/equalsAndHashcode/EqualsAndHashcodeBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/equalsAndHashcode/EqualsAndHashcodeBase.java index b21c8b7457b7..0ec319ce010c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/equalsAndHashcode/EqualsAndHashcodeBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/equalsAndHashcode/EqualsAndHashcodeBase.java @@ -58,6 +58,10 @@ public class EqualsAndHashcodeBase extends AbstractBaseJavaLocalInspectionTool { boolean [] hasHashCode = {false}; processClass(aClass, hasEquals, hasHashCode, myEquals, myHashCode); if (hasEquals[0] != hasHashCode[0]) { + if (hasHashCode[0] && aClass.isRecord()) { + // Probably better distributed hashCode is implemented for a record class where default equals works fine + return; + } PsiIdentifier identifier = aClass.getNameIdentifier(); holder.registerProblem(identifier != null ? identifier : aClass, hasEquals[0] diff --git a/java/java-tests/testData/inspection/equalsAndHashcode/record/expected.xml b/java/java-tests/testData/inspection/equalsAndHashcode/record/expected.xml new file mode 100644 index 000000000000..c63c9258595e --- /dev/null +++ b/java/java-tests/testData/inspection/equalsAndHashcode/record/expected.xml @@ -0,0 +1,2 @@ + + diff --git a/java/java-tests/testData/inspection/equalsAndHashcode/record/src/Pixel.java b/java/java-tests/testData/inspection/equalsAndHashcode/record/src/Pixel.java new file mode 100644 index 000000000000..b37d01c2b971 --- /dev/null +++ b/java/java-tests/testData/inspection/equalsAndHashcode/record/src/Pixel.java @@ -0,0 +1,13 @@ +public record Pixel(int x,int y) implements Comparable { + @Override + public int hashCode(){ + return x*2880+y; // for better distribution + } + + @Override + public int compareTo(Pixel o){ + int result = Integer.compare(x,o.x); + if(result==0) result = Integer.compare(y,o.y); + return result; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/EqualsAndHashCodeTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/EqualsAndHashCodeTest.java index b002f4132dbd..d784b86e9544 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/EqualsAndHashCodeTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/EqualsAndHashCodeTest.java @@ -19,8 +19,15 @@ package com.intellij.java.codeInspection; import com.intellij.JavaTestUtil; import com.intellij.codeInspection.equalsAndHashcode.EqualsAndHashcode; import com.intellij.testFramework.JavaInspectionTestCase; +import com.intellij.testFramework.LightProjectDescriptor; +import org.jetbrains.annotations.NotNull; public class EqualsAndHashCodeTest extends JavaInspectionTestCase { + @Override + protected @NotNull LightProjectDescriptor getProjectDescriptor() { + return JAVA_16; + } + private EqualsAndHashcode myTool = new EqualsAndHashcode(); @Override @@ -47,4 +54,7 @@ public class EqualsAndHashCodeTest extends JavaInspectionTestCase { doTest(); } + public void testRecord() { + doTest(); + } }