Warning: session_start(): open(/var/lib/php/sessions/sess_olbkcmp2l6rl3u1ps2d305qq0q, 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
sclass ConvertLASToJava > Meta {
replace Tk with GazelleV_LeftArrowScript.
delegate Evaluable to Tk.
O convert(LASClassDef.FieldDef field) {
ret "/*settable?*/ " + shortClassName(field.type()) + " " + field.name() + ";";
}
O convert(Tk.FunctionDef f) {
ret "O " + f.name + "(" + joinWithComma(map(f.args, arg -> "O " + arg)) + ") {\n"
+ indentx(convert(f.body, true))
+ "}\n";
}
O convertWithLeadingSpace(Evaluable o) {
ret leadingSpace(o, "") + convert(o);
}
O convertWithLeadingSpace2(Evaluable o) {
ret replaceIfEqual(leadingSpace(o, ""), " ", "") + convert(o);
}
S leadingSpace(Evaluable o, S defaultSpace) {
S space = null;
var src = o.tokenRangeWithSrc();
if (src != null)
space = src.startPtr().mapIdx(idx -> idx & ~1)!;
ret or2(space, defaultSpace);
}
S trailingSpace(Evaluable o, S defaultSpace) {
S space = null;
var src = o.tokenRangeWithSrc();
if (src != null) {
S rawSpace = src.endPtr().mapIdx(idx -> idx & ~1)!;
space = replaceRegexp(rawSpace, "\n[ \t]+$", "\n");
if (scaffoldingEnabled()) printVars trailingSpace(rawSpace := quote(rawSpace), space := quote(space));
}
ret or2(space, defaultSpace);
}
O getInstruction(Evaluable o) {
O inner = convert(o);
bool needSemicolon = !o instanceof Tk.ClassDef
&& !o instanceof Tk.ForEachBase;
S space = trailingSpace(o, "\n");
if (scaffoldingEnabled()) printVars(+space, o := className(o), srcText := quote(o.srcText()), +inner);
ret inner + (needSemicolon ? ";" : "") + space;
}
O convert(Tk.Script script, bool returnLastResult) {
var steps = asList(script.steps);
if (returnLastResult) {
if (empty(steps)) ret "return null;";
var last = last(steps);
if (!last instanceof Tk.ReturnFromScript
&& !last instanceof Tk.ClassDef)
setLast(steps, new Tk.ReturnFromScript(script, last));
}
ret concatMapStrings(i -> str(getInstruction(i)), steps);
}
O convert(Evaluable o, bool returnLastResult) {
if (o cast Tk.Script)
ret convert(o, returnLastResult);
ret convert(o);
}
O convert(Evaluable o) {
if (o == null) null;
// These are the properly implemented cases
if (o cast Tk.GetVar)
ret o.var;
if (o cast Tk.Script)
ret convert(o, false);
if (o cast Tk.ClassDef) {
LASClassDef c = o.lasClass.classDef;
ret "class " + c.userGivenName + " " + curly("\n" + appendNewLineIfNempty(indentx(
joinNemptiesWithEmptyLines(
lines_rtrim(map convert(c.fields)),
lines_rtrim(map convert(c.methods)))
)));
}
if (o cast Tk.Assignment)
ret o.var + " = " + convert(o.expression);
if (o cast Tk.VarDeclaration)
ret "var " + o.var + " = " + convert(o.expression);
if (o cast Tk.CallMethod) {
S targetStr = null;
var targetType = o.target.returnType();
if (targetType.knownValue()) {
O target = targetType.value();
if (target cast Class && eqOneOf(shortClassName(target), "main", "utils"))
targetStr = "";
}
if (targetStr == null)
targetStr = str(convert(o.target));
ret (empty(targetStr) ? "" : targetStr + ".")
+ FunctionCall(o.methodName, map convertWithLeadingSpace2(o.args));
}
if (o cast Tk.SetField)
ret convert(o.target) + "." + o.name + " = " + convert(o.expr);
if (o cast Tk.CallMethodOrGetField)
ret convert(o.target) + "." + o.name + "()";
if (o cast Tk.NewObject)
ret "new " + FunctionCall(shortClassName(o.c), map convert(o.args));
if (o cast Tk.IfThen)
ret "if (" + convert(o.condition) + ") "
+ curlyIfScript(o.body)
+ (o.elseBranch == null ? "" : " else "
+ curlyIfScript(o.elseBranch));
if (o cast Tk.Const) {
var c = o;
try object c?.srcText();
pcall {
ret toJava(o.value);
}
}
if (o cast Tk.ForEach)
ret "fOr (" + o.var + " : " + convert(o.collection) + ") {\n"
+ indentx(convert(o.body, false)) + "\n}";
if (o cast Tk.CurriedScriptFunctionLambda) {
int nArgs = o.implementedMethod.getParameterCount();
LS args = countIteratorToList_incl(1, nArgs, i ->"_" + i);
L fullArgs = concatLists(allToString(map convert(o.curriedArgs)), args);
ret roundBracketed(shortClassName(o.intrface))
+ " " + lambdaArgsToString_pureJava(args) + " -> "
+ FunctionCall(o.f.name, fullArgs);
}
if (o cast Tk.LambdaDef)
ret roundBracketed(shortClassName(o.intrface))
+ " "
+ joinNemptiesWithSpace(lambdaArgsToString_pureJava(o.args), "-> "
+ curlyIfScript(o.body));
if (o cast Tk.ReturnFromScript)
ret "ret " + convert(o.value);
// end of explicitly handled cases
warn("Can't convert to Java: " + className(o));
// Retain original script text as a default
if (o cast Tk.Base) {
var b = o;
try object b?.srcText();
}
// If that fails (it shouldn't), just return the toString
warn("No source reference in script object: " + className(o));
ret str(o);
}
O curlyIfScript(Evaluable o) {
if (o cast Tk.Script)
ret "{\n" + indentx(convert(o)) + "\n}";
ret convert(o);
}
// get is convert + postProcess
S get(Evaluable o, bool returnLastResult) {
S src = strOrEmpty(convert(o, returnLastResult));
JavaXPeepholeShortener shortener = new(javaTok(src));
shortener.run();
ret join(shortener.tok);
}
}