support for arrays in template j.u.Objects.equals/hashCode (IDEA-162302)

This commit is contained in:
Anna Kozlova
2017-06-08 17:49:06 +03:00
parent 52e5edb007
commit e78186d6ae
6 changed files with 155 additions and 11 deletions
@@ -2,19 +2,75 @@ public int hashCode() {
#if (!$superHasHashCode && $fields.size()==1 && $fields[0].array)
return java.util.Arrays.hashCode($fields[0].accessor);
#else
return java.util.Objects.hash(##
#set($i = 0)
#if($superHasHashCode)
super.hashCode() ##
#set($i = 1)
#set($hasArrays = false)
#set($hasNoArrays = false)
#foreach($field in $fields)
#if ($field.array)
#set($hasArrays = true)
#else
#set($hasNoArrays = true)
#end
#end
#if (!$hasArrays)
return java.util.Objects.hash(##
#set($i = 0)
#if($superHasHashCode)
super.hashCode() ##
#set($i = 1)
#end
#foreach($field in $fields)
#if ($i > 0)
, ##
#end
$field.accessor ##
#set($i = $i + 1)
#end
);
#else
#set($resultName = $helper.getUniqueLocalVarName("result", $fields, $settings))
#set($resultAssigned = false)
#set($resultDeclarationCompleted = false)
int $resultName ##
#if($hasNoArrays)
= java.util.Objects.hash(##
#set($i = 0)
#if($superHasHashCode)
super.hashCode() ##
#set($i = 1)
#end
#foreach($field in $fields)
#if(!$field.array)
#if ($i > 0)
, ##
#end
$field.accessor ##
#set($i = $i + 1)
#end
#end
);
#set($resultAssigned = true)
#set($resultDeclarationCompleted = true)
#elseif($superHasHashCode)
= super.hashCode(); ##
#set($resultAssigned = true)
#set($resultDeclarationCompleted = true)
#end
#foreach($field in $fields)
#if ($i > 0)
, ##
#if($field.array)
#if ($resultDeclarationCompleted)
$resultName ##
#end
= ##
#if ($resultAssigned)
31 * $resultName + ##
#end
java.util.Arrays.hashCode($field.accessor);
#set($resultAssigned = true)
#set($resultDeclarationCompleted = true)
#end
$field.accessor ##
#set($i = $i + 1)
#end
);
#end
return $resultName;
#end
#end
}
@@ -0,0 +1,29 @@
import java.util.Arrays;
import java.util.Objects;
class A {
int i;
String s;
int[] a1;
int[] a2;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final A a = (A) o;
return i == a.i &&
Objects.equals(s, a.s) &&
Arrays.equals(a1, a.a1) &&
Arrays.equals(a2, a.a2);
}
@Override
public int hashCode() {
int result = Objects.hash(i, s);
result = 31 * result + Arrays.hashCode(a1);
result = 31 * result + Arrays.hashCode(a2);
return result;
}
}
@@ -0,0 +1,31 @@
import java.util.Arrays;
class I {
public int hashCode() {
return 0;
}
public boolean equals(Object o) {
return o == this;
}
}
class A extends I {
int[] a1;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
final A a = (A) o;
return Arrays.equals(a1, a.a1);
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + Arrays.hashCode(a1);
return result;
}
}
@@ -0,0 +1,7 @@
class A {
int i;
String s;
int[] a1;
int[] a2;
<caret>
}
@@ -0,0 +1,13 @@
class I {
public int hashCode() {
return 0;
}
public boolean equals(Object o) {
return o == this;
}
}
class A extends I {
int[] a1;
<caret>
}
@@ -68,6 +68,14 @@ public class GenerateEquals15Test extends GenerateEqualsTestCase {
doTestWithTemplate(EqualsHashCodeTemplatesManager.JAVA_UTIL_OBJECTS_EQUALS_AND_HASH_CODE);
}
public void testArrayAndNotOnlyArrayWithObjectsTemplate() throws Exception {
doTestWithTemplate(EqualsHashCodeTemplatesManager.JAVA_UTIL_OBJECTS_EQUALS_AND_HASH_CODE);
}
public void testArrayAndSuperWithObjectsTemplate() throws Exception {
doTestWithTemplate(EqualsHashCodeTemplatesManager.JAVA_UTIL_OBJECTS_EQUALS_AND_HASH_CODE);
}
private void doTestWithTemplate(String templateName) throws Exception {
try {
EqualsHashCodeTemplatesManager.getInstance().setDefaultTemplate(templateName);