sS tok_genEqualsAndHashCode(S className, L> fields) { ret [[public bool equals(O o) { if (!o instanceof ]] + className + [[) false; ]] + className + [[ x = cast o; ret ]] + join(" && ", map(fields, func(Pair p) { // TODO: use == for primitive fields "eq(" + p.b + ", x." + p.b + ")" })) + [[; } public int hashCode() { int h = ]] + hashCode(className) + [[; ]] + concatMap_strings(fields, func(Pair p) { "h = h*2+hashCode(" + p.b + [[); ]]}) + [[ ret h; } ]]; }