private void addHashCode(JDefinedClass jclass, JsonNode node) {
    Map<String, JFieldVar> fields = removeFieldsExcludedFromEqualsAndHashCode(jclass.fields(), node);

    JMethod hashCode = jclass.method(JMod.PUBLIC, int.class, "hashCode");
    JBlock body = hashCode.body();
    JVar result = body.decl(jclass.owner().INT, "result", JExpr.lit(1));

    // Incorporate each non-excluded field in the hashCode calculation
    for (JFieldVar fieldVar : fields.values()) {
      if ((fieldVar.mods().getValue() & JMod.STATIC) == JMod.STATIC) {
        continue;
      }

      JFieldRef fieldRef = JExpr.refthis(fieldVar.name());

      JExpression fieldHash;
      if (fieldVar.type().isPrimitive()) {
        if ("long".equals(fieldVar.type().name())) {
          fieldHash = JExpr.cast(jclass.owner().INT, fieldRef.xor(fieldRef.shrz(JExpr.lit(32))));
        }
        else if ("boolean".equals(fieldVar.type().name())) {
          fieldHash = JOp.cond(fieldRef, JExpr.lit(1), JExpr.lit(0));
        }
        else if ("int".equals(fieldVar.type().name())) {
          fieldHash = fieldRef;
        }
        else if ("double".equals(fieldVar.type().name())) {
          JClass doubleClass = jclass.owner().ref(Double.class);
          JExpression longField = doubleClass.staticInvoke("doubleToLongBits").arg(fieldRef);
          fieldHash = JExpr.cast(jclass.owner().INT,
                                 longField.xor(longField.shrz(JExpr.lit(32))));
        }
        else if ("float".equals(fieldVar.type().name())) {
          fieldHash = jclass.owner().ref(Float.class).staticInvoke("floatToIntBits").arg(fieldRef);
        }
        else {
          fieldHash = JExpr.cast(jclass.owner().INT, fieldRef);
        }
      }
      else if (fieldVar.type().isArray()) {
        if (!fieldVar.type().elementType().isPrimitive()) {
          throw new UnsupportedOperationException("Only primitive arrays are supported");
        }

        fieldHash = jclass.owner().ref(Arrays.class).staticInvoke("hashCode").arg(fieldRef);
      }
      else {
        fieldHash = JOp.cond(fieldRef.eq(JExpr._null()), JExpr.lit(0), fieldRef.invoke("hashCode"));
      }

      body.assign(result, result.mul(JExpr.lit(31)).plus(fieldHash));
    }

    // Add super.hashCode()
    if (!jclass._extends().fullName().equals(Object.class.getName())) {
      body.assign(result, result.mul(JExpr.lit(31)).plus(JExpr._super().invoke("hashCode")));
    }

    body._return(result);
    hashCode.annotate(Override.class);
  }
private void addHashCode(JDefinedClass jclass, JsonNode node)