remove type annotations from expressions for hscript consumption

This commit is contained in:
2021-05-18 16:45:21 -06:00
parent dfba66b900
commit 4cd7d42aa9
4 changed files with 60 additions and 11 deletions

View File

@@ -354,6 +354,26 @@ class Helpers {
return def.withPosOf(exp); return def.withPosOf(exp);
} }
public static function removeTypeAnnotations(exp:ReaderExp):ReaderExp {
var def = switch (exp.def) {
case Symbol(_) | StrExp(_) | RawHaxe(_):
exp.def;
case CallExp(func, callArgs):
CallExp(removeTypeAnnotations(func), callArgs.map(removeTypeAnnotations));
case ListExp(elements):
ListExp(elements.map(removeTypeAnnotations));
case TypedExp(type, innerExp):
innerExp.def;
case FieldExp(field, innerExp):
FieldExp(field, removeTypeAnnotations(innerExp));
case KeyValueExp(keyExp, valueExp):
KeyValueExp(removeTypeAnnotations(keyExp), removeTypeAnnotations(valueExp));
default:
throw CompileError.fromExp(exp, 'cannot remove type annotations');
};
return def.withPosOf(exp);
}
// Return convenient functions for succinctly making new ReaderExps that link back to an original exp's // Return convenient functions for succinctly making new ReaderExps that link back to an original exp's
// position in source code // position in source code
public static function expBuilder(posRef:ReaderExp) { public static function expBuilder(posRef:ReaderExp) {

View File

@@ -32,7 +32,8 @@ typedef KissState = {
callAliases:Map<String, ReaderExpDef>, callAliases:Map<String, ReaderExpDef>,
identAliases:Map<String, ReaderExpDef>, identAliases:Map<String, ReaderExpDef>,
fields:Array<Field>, fields:Array<Field>,
loadingDirectory:String loadingDirectory:String,
hscript:Bool
}; };
class Kiss { class Kiss {
@@ -63,7 +64,8 @@ class Kiss {
], ],
identAliases: new Map(), identAliases: new Map(),
fields: [], fields: [],
loadingDirectory: "" loadingDirectory: "",
hscript: false
}; };
// Helpful aliases // Helpful aliases
@@ -156,6 +158,9 @@ class Kiss {
// Bind the table arguments of this function for easy recursive calling/passing // Bind the table arguments of this function for easy recursive calling/passing
var convert = readerExpToHaxeExpr.bind(_, k); var convert = readerExpToHaxeExpr.bind(_, k);
if (k.hscript)
exp = Helpers.removeTypeAnnotations(exp);
var expr = switch (exp.def) { var expr = switch (exp.def) {
case Symbol(alias) if (k.identAliases.exists(alias)): case Symbol(alias) if (k.identAliases.exists(alias)):
readerExpToHaxeExpr(k.identAliases[alias].withPosOf(exp), k); readerExpToHaxeExpr(k.identAliases[alias].withPosOf(exp), k);

View File

@@ -23,10 +23,21 @@ class Main {
static macro function macroMain():Expr { static macro function macroMain():Expr {
var k = Kiss.defaultKissState(); var k = Kiss.defaultKissState();
k.wrapListExps = false; k.wrapListExps = false;
if (Sys.args().indexOf("--all") != -1) { var args = Sys.args();
var pretty = args.indexOf("--pretty") != -1;
k.hscript = args.indexOf("--hscript") != -1;
function print(s:String) {
if (!pretty)
s = s.replace("\n", " ");
Sys.println(s);
}
if (args.indexOf("--all") != -1) {
var kissInputStream = Stream.fromString(Sys.stdin().readAll().toString()); var kissInputStream = Stream.fromString(Sys.stdin().readAll().toString());
Reader.readAndProcess(kissInputStream, k, (readerExp) -> { Reader.readAndProcess(kissInputStream, k, (readerExp) -> {
Sys.println(Kiss.readerExpToHaxeExpr(readerExp, k).toString()); print(Kiss.readerExpToHaxeExpr(readerExp, k).toString());
}); });
} else { } else {
var line = ""; var line = "";
@@ -47,7 +58,7 @@ class Main {
var kissInputStream = Stream.fromString(line); var kissInputStream = Stream.fromString(line);
Reader.readAndProcess(kissInputStream, k, (readerExp) -> { Reader.readAndProcess(kissInputStream, k, (readerExp) -> {
Sys.println(Kiss.readerExpToHaxeExpr(readerExp, k).toString()); print(Kiss.readerExpToHaxeExpr(readerExp, k).toString());
}); });
line = ""; line = "";

View File

@@ -276,14 +276,20 @@ class Prelude {
return v; return v;
} }
#if sys
private static var kissProcess:Process = null;
#end
/** /**
* On Sys targets and nodejs, Kiss can be converted to hscript at runtime * On Sys targets and nodejs, Kiss can be converted to hscript at runtime
* NOTE on non-nodejs targets, after the first time calling this function,
* it will be much faster
* NOTE on non-nodejs sys targets, newlines in raw strings will be stripped away. * NOTE on non-nodejs sys targets, newlines in raw strings will be stripped away.
* So don't use raw string literals in Kiss you want parsed and evaluated at runtime. * So don't use raw string literals in Kiss you want parsed and evaluated at runtime.
*/ */
public static function convertToHScript(kissStr:String):String { public static function convertToHScript(kissStr:String):String {
#if (!macro && hxnodejs) #if (!macro && hxnodejs)
var kissProcess = ChildProcess.spawnSync("haxelib", ["run", "kiss", "--all"], {input: '${kissStr}\n'}); var kissProcess = ChildProcess.spawnSync("haxelib", ["run", "kiss", "--all", "--hscript"], {input: '${kissStr}\n'});
if (kissProcess.status != 0) { if (kissProcess.status != 0) {
var error:String = kissProcess.stderr; var error:String = kissProcess.stderr;
throw 'failed to convert ${kissStr} to hscript: ${error}'; throw 'failed to convert ${kissStr} to hscript: ${error}';
@@ -291,13 +297,20 @@ class Prelude {
var output:String = kissProcess.stdout; var output:String = kissProcess.stdout;
return output; return output;
#elseif sys #elseif sys
var kissProcess = new Process("haxelib", ["run", "kiss"]); if (kissProcess == null)
kissProcess = new Process("haxelib", ["run", "kiss", "--hscript"]);
kissProcess.stdin.writeString('${kissStr.replace("\n", " ")}\n'); kissProcess.stdin.writeString('${kissStr.replace("\n", " ")}\n');
var output = kissProcess.stdout.readLine(); try {
if (output.startsWith(">>> ")) { var output = kissProcess.stdout.readLine();
output = output.substr(4); if (output.startsWith(">>> ")) {
output = output.substr(4);
}
return output;
} catch (e) {
var error = kissProcess.stderr.readAll().toString();
throw 'failed to convert ${kissStr} to hscript: ${error}';
} }
return output;
#else #else
throw "Can't convert Kiss to HScript on this target."; throw "Can't convert Kiss to HScript on this target.";
#end #end