Warning: session_start(): open(/var/lib/php/sessions/sess_niai1a9snb9ncth6emtq8l6ien, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
// TODO: sometimes equals/hashCode is not generated. See an old version of #1026301
sbool tok_recordDecls_autoWithToList = true;
static void tok_recordDecls(L tok) {
int i;
bool re = false;
jreplace(tok, "record > {", "record $2 extends $4 {");
jreplace(tok, "record > <> {", "record $2 extends $4 $5 $6 $7 {");
jreplace(tok, "record {", "record $2() {");
jreplace(tok, "record implements", "record $2() implements");
while ((i = jfind_any(tok, "record (", "record <")) >= 0) {
int argsFrom = smartIndexOf(tok, i, "(")+2;
int argsTo = findCodeTokens(tok, argsFrom, false, ")");
int idx = findCodeTokens(tok, argsTo, false, "{");
ifdef tok_recordDecls_debug
assertEqualsVerbose("{", get(tok, idx));
endifdef
int j = findEndOfBracketPart(tok, idx);
S name = tok.get(i+2);
// TODO: accept multiple of these
bool noEq = eq(get(tok, i-2), "noeq");
if (noEq) tok.set(i-2, "");
bool flexEq = eq(get(tok, i-2), "flexeq"); // fix for records inside of parameterized classes
if (flexEq) tok.set(i-2, "");
bool noToString = eq(get(tok, i-2), "noToString");
if (noToString) tok.set(i-2, "");
bool withToList = eq(get(tok, i-2), "withToList");
if (withToList) tok.set(i-2, "");
bool withTransformable = eq(get(tok, i-2), "transformable");
if (withTransformable) tok.set(i-2, "");
withToList = withToList || tok_recordDecls_autoWithToList;
new StringBuilder buf;
L tArgs = subList(tok, argsFrom-1, argsTo);
LPairS args = tok_typesAndNamesOfParams(tArgs, typelessMeansObject := true);
L contents = subList(tok, idx+1, j);
for (Pair p : args)
buf.append("\n " + jreplace(p.a, "...", "[]") + " " + p.b + ";");
if (nempty(args)) buf.append("\n *() {}");
buf.append("\n *(" + joinWithComma(map(args, func(Pair p) -> S {
dropPrefix("new ", p.a) + " *" + p.b })) + ") {}");
if (!noToString && !(jfind(contents, "toString {") >= 0 || jfind(contents, "toString()") >= 0))
buf.append("\n toString { ret "
+ [[shortClassName(this) + "(" + ]]
+ join([[ + ", " + ]], secondOfPairs(args))
+ " + \")\"; }");
if (!noEq) {
//buf.append("\n [stdEq]");
buf.append(tok_genEqualsAndHashCode(name, args, +flexEq);
}
if (withToList)
buf.append(tok_genRecordFieldsToList(args));
if (withTransformable)
buf.append(tok_genRecordTransformable(name, args));
S interfaces = joinNemptiesWithComma(
withToList ? "IFieldsToList" : "",
withTransformable ? "Transformable" : "");
tok.set(idx, (empty(interfaces) ? ""
: (contains(subList(tok, argsTo, idx), "implements") ? "," : "implements") + " " + interfaces)
+ "{" + buf);
ifdef tok_recordDecls_debug
print("tok_recordDecls replaced " + tok.get(idx));
print("tok_recordDecls whole: " + join(tok));
endifdef
tok.set(i, "class");
clearTokens(tok, argsFrom-2, argsTo+1);
reTok(tok, i, idx+1);
tok_addFieldOrder(tok, i);
ifdef tok_recordDecls_debug
print("tok_recordDecls whole 2: " + join(tok));
endifdef
set re;
}
if (re) reTok(tok);
}