Skip to content

Commit 5041225

Browse files
VineetReynoldsgastaldi
authored andcommitted
FORGE-995 Modified the equals and hashcode generator.
This is an API breaking change due to the introduction of a new parameter in the method.
1 parent 4a5e4ee commit 5041225

File tree

2 files changed

+84
-6
lines changed

2 files changed

+84
-6
lines changed

api/src/main/java/org/jboss/forge/parser/java/util/Refactory.java

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,56 @@ public static void createGetterAndSetter(final JavaClass clazz, final Field<Java
4444
}
4545
}
4646

47-
public static void createHashCodeAndEquals(final JavaClass clazz)
47+
public static void createHashCodeAndEquals(final JavaClass clazz, final Field<?>... fields)
4848
{
49+
if(fields == null || fields.length < 1)
50+
{
51+
throw new IllegalArgumentException("fields cannot be null or empty.");
52+
}
53+
54+
StringBuilder fieldEqualityChecks = new StringBuilder();
55+
StringBuilder hashCodeComputation = new StringBuilder();
56+
for (Field<?> field : fields)
57+
{
58+
String fieldName = field.getName();
59+
60+
if (field.isPrimitive())
61+
{
62+
fieldEqualityChecks.append("if (").append(fieldName).append(" != that.").append(fieldName).append(") { ");
63+
fieldEqualityChecks.append(" return false;");
64+
fieldEqualityChecks.append("} ");
65+
66+
hashCodeComputation.append("result = prime * result + ").append(fieldName).append(";");
67+
}
68+
else
69+
{
70+
fieldEqualityChecks.append("if (").append(fieldName).append(" != null) { ");
71+
fieldEqualityChecks.append(" return ").append(fieldName).append(".equals(((");
72+
fieldEqualityChecks.append(clazz.getName());
73+
fieldEqualityChecks.append(") that).").append(fieldName);
74+
fieldEqualityChecks.append("); } ");
75+
76+
hashCodeComputation.append("result = prime * result + ((").append(fieldName).append(" == null) ? 0 : ")
77+
.append(fieldName).append(".hashCode());");
78+
}
79+
}
80+
4981
clazz.addMethod(
5082
"public boolean equals(Object that) { " +
5183
"if (this == that) { return true; } " +
5284
"if (that == null) { return false; } " +
5385
"if (getClass() != that.getClass()) { return false; } " +
54-
"if (id != null) { return id.equals((("
55-
+ clazz.getName() + ") that).id); } " +
56-
"return super.equals(that); " +
86+
fieldEqualityChecks.toString() +
87+
"return true; " +
5788
"}")
5889
.addAnnotation(Override.class);
5990

6091
clazz.addMethod(
6192
"public int hashCode() { " +
62-
"if (id != null) { return id.hashCode(); } " +
63-
"return super.hashCode(); }")
93+
"final int prime = 31;" +
94+
"int result = 1;" +
95+
hashCodeComputation.toString() +
96+
"return result; }")
6497
.addAnnotation(Override.class);
6598
}
6699

impl/src/test/java/org/jboss/forge/test/parser/java/util/RefactoryTest.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88

99
import static org.junit.Assert.assertEquals;
1010
import static org.junit.Assert.assertFalse;
11+
import static org.junit.Assert.assertThat;
1112
import static org.junit.Assert.assertTrue;
13+
import static org.junit.matchers.JUnitMatchers.containsString;
1214

1315
import java.util.List;
1416

@@ -106,4 +108,47 @@ public void testCreateToStringFromFields() throws Exception
106108
assertTrue(javaClass.getMethod("toString").getBody().contains("return"));
107109
assertTrue(javaClass.getMethod("toString").getBody().contains("firstName != null"));
108110
}
111+
112+
@Test
113+
public void testCreateHashCodeAndEquals() throws Exception
114+
{
115+
Field<JavaClass> field = javaClass.getField("foo");
116+
Refactory.createHashCodeAndEquals(javaClass, field);
117+
118+
List<Method<JavaClass>> methods = javaClass.getMethods();
119+
Method<JavaClass> equals = methods.get(0);
120+
Method<JavaClass> hashcode = methods.get(1);
121+
122+
assertEquals("equals", equals.getName());
123+
assertEquals(1, equals.getParameters().size());
124+
assertThat(equals.getBody(), containsString("if (foo != that.foo) {\n return false;\n}"));
125+
126+
assertEquals("hashCode", hashcode.getName());
127+
assertEquals(0, hashcode.getParameters().size());
128+
assertEquals("int", hashcode.getReturnType());
129+
assertThat(hashcode.getBody(), containsString("result=prime * result + foo;"));
130+
}
131+
132+
@Test
133+
public void testCreateHashCodeAndEqualsMultipleFields() throws Exception
134+
{
135+
Field<JavaClass> intField = javaClass.getField("foo");
136+
Field<JavaClass> stringField = javaClass.getField("firstName");
137+
Refactory.createHashCodeAndEquals(javaClass, intField, stringField);
138+
139+
List<Method<JavaClass>> methods = javaClass.getMethods();
140+
Method<JavaClass> equals = methods.get(0);
141+
Method<JavaClass> hashcode = methods.get(1);
142+
143+
assertEquals("equals", equals.getName());
144+
assertEquals(1, equals.getParameters().size());
145+
assertThat(equals.getBody(), containsString("if (foo != that.foo) {\n return false;\n}"));
146+
assertThat(equals.getBody(), containsString("if (firstName != null) {\n return firstName.equals(((Foo)that).firstName);\n}"));
147+
148+
assertEquals("hashCode", hashcode.getName());
149+
assertEquals(0, hashcode.getParameters().size());
150+
assertEquals("int", hashcode.getReturnType());
151+
assertThat(hashcode.getBody(), containsString("result=prime * result + foo;"));
152+
assertThat(hashcode.getBody(), containsString("result=prime * result + ((firstName == null) ? 0 : firstName.hashCode());"));
153+
}
109154
}

0 commit comments

Comments
 (0)