private static MethodSpec createHashCode()

in dataenum-processor/src/main/java/com/spotify/dataenum/processor/generator/value/ValueTypeFactory.java [260:300]


  private static MethodSpec createHashCode(OutputValue value) {
    MethodSpec.Builder result =
        MethodSpec.methodBuilder("hashCode")
            .addAnnotation(Override.class)
            .addModifiers(Modifier.PUBLIC)
            .returns(int.class);

    if (!value.hasParameters()) {
      result.addStatement("return 0");
      return result.build();
    }

    result.addStatement("int result = 0");

    int parameterCount = Iterables.sizeOf(value.parameters());
    int parameterIndex = 0;

    for (Parameter parameter : value.parameters()) {
      String fieldName = parameter.name();
      parameterIndex++;

      if (parameterIndex == parameterCount) {
        result.addCode("return result * 31 + ");
      } else {
        result.addCode("result = result * 31 + ");
      }
      if (parameter.type().isPrimitive()) {
        TypeName boxedType = parameter.type().box();
        result.addStatement("$T.valueOf(this.$L).hashCode()", boxedType, fieldName);
      } else if (isArrayType(parameter)) {
        result.addStatement("$T.hashCode(this.$L)", ClassName.get(Arrays.class), fieldName);
      } else {
        if (parameter.canBeNull()) {
          result.addStatement("(this.$1L != null ? this.$1L.hashCode() : 0)", fieldName);
        } else {
          result.addStatement("this.$L.hashCode()", fieldName);
        }
      }
    }
    return result.build();
  }