diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/equalsHelper.vm b/java/java-impl/src/com/intellij/codeInsight/generation/equalsHelper.vm index 52c05f12d9af..d6dabc95d5e4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/equalsHelper.vm +++ b/java/java-impl/src/com/intellij/codeInsight/generation/equalsHelper.vm @@ -37,3 +37,13 @@ if(this == $paramName) return true; if($paramName == null || getClass() != ${paramName}.getClass()) return false; #end #end +#macro(addPrimitiveFieldComparisonCondition $field) + $field.accessor != ${classInstanceName}.$field.accessor ## +#end +#macro(addDoubleFieldComparisonCondition $field) + #if ($field.double) + Double.compare(${classInstanceName}.$field.accessor, $field.accessor) != 0 ## + #else + Float.compare(${classInstanceName}.$field.accessor, $field.accessor) != 0 ## + #end +#end diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/guavaEquals.vm b/java/java-impl/src/com/intellij/codeInsight/generation/guavaEquals.vm index fce84f143d47..879ec80e2f8a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/guavaEquals.vm +++ b/java/java-impl/src/com/intellij/codeInsight/generation/guavaEquals.vm @@ -13,7 +13,17 @@ Object $paramName){ && #end #set($i = $i + 1) + #if ($field.primitive) + #if ($field.double || $field.float) + #addDoubleFieldComparisonCondition($field) ## + #else + #addPrimitiveFieldComparisonCondition($field) ## + #end + #elseif ($field.enum) + #addPrimitiveFieldComparisonCondition($field) ## + #else com.google.common.base.Objects.equal($field.accessor, ${classInstanceName}.$field.accessor)## + #end #end ; } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm b/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm index f87075daf08e..f7361fb3765a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm +++ b/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm @@ -13,7 +13,17 @@ Object $paramName){ && #end #set($i = $i + 1) + #if ($field.primitive) + #if ($field.double || $field.float) + #addDoubleFieldComparisonCondition($field) ## + #else + #addPrimitiveFieldComparisonCondition($field) ## + #end + #elseif ($field.enum) + #addPrimitiveFieldComparisonCondition($field) ## + #else java.util.Objects.equals($field.accessor, ${classInstanceName}.$field.accessor)## + #end #end ; } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeGuava.java b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeGuava.java index 0e9d2114aa94..701e5871c6b1 100644 --- a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeGuava.java +++ b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeGuava.java @@ -34,12 +34,12 @@ class A extends B { if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; final A a = (A) o; - return com.google.common.base.Objects.equal(a7, a.a7) && - com.google.common.base.Objects.equal(a8, a.a8) && - com.google.common.base.Objects.equal(a9, a.a9) && - com.google.common.base.Objects.equal(a10, a.a10) && - com.google.common.base.Objects.equal(a11, a.a11) && - com.google.common.base.Objects.equal(a12, a.a12) && + return a7 != a.a7 && + a8 != a.a8 && + a9 != a.a9 && + a10 != a.a10 && + Float.compare(a.a11, a11) != 0 && + Double.compare(a.a12, a12) != 0 && com.google.common.base.Objects.equal(a1, a.a1) && com.google.common.base.Objects.equal(a2, a.a2) && com.google.common.base.Objects.equal(a3, a.a3) &&