in dataenum-processor/src/main/java/com/spotify/dataenum/processor/generator/value/ValueTypeFactory.java [168:242]
private static MethodSpec createEquals(OutputValue value) throws ParserException {
MethodSpec.Builder result =
MethodSpec.methodBuilder("equals")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(boolean.class)
.addParameter(Object.class, "other");
if (!value.parameters().iterator().hasNext()) {
result.addStatement("return other instanceof $T", value.outputClass());
return result.build();
}
result.addStatement("if (other == this) return true");
result.addStatement("if (!(other instanceof $T)) return false", value.outputClass());
TypeName wildCardTypeName = withWildCardTypeParameters(value);
result.addStatement("$1T o = ($1T) other", wildCardTypeName);
result.addCode("$[return ");
List<Parameter> usingReferenceEquality = new ArrayList<>();
List<Parameter> usingArraysEquality = new ArrayList<>();
List<Parameter> usingEquals = new ArrayList<>();
for (Parameter parameter : value.parameters()) {
if (isArrayType(parameter)) {
usingArraysEquality.add(parameter);
} else if (useReferenceEquality(parameter)) {
usingReferenceEquality.add(parameter);
} else {
usingEquals.add(parameter);
}
}
boolean first = true;
for (Parameter parameter : usingReferenceEquality) {
if (first) {
first = false;
} else {
result.addCode("\n&& ");
}
String fieldName = parameter.name();
result.addCode("o.$1L == $1L", fieldName);
}
for (Parameter parameter : usingArraysEquality) {
if (first) {
first = false;
} else {
result.addCode("\n&& ");
}
result.addCode("$1T.equals(o.$2L, $2L)", ClassName.get(Arrays.class), parameter.name());
}
for (Parameter parameter : usingEquals) {
if (first) {
first = false;
} else {
result.addCode("\n&& ");
}
String fieldName = parameter.name();
if (parameter.canBeNull()) {
result.addCode("equal(o.$1L, this.$1L)", fieldName);
} else {
result.addCode("o.$1L.equals(this.$1L)", fieldName);
}
}
result.addCode(";\n$]");
return result.build();
}