private static MethodSpec createEquals()

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();
  }