From dfba66b9000f9a2ee8a1b605e8f4ed76d480a25a Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Tue, 18 May 2021 15:35:48 -0600 Subject: [PATCH] multi-target convertToHScript function in Prelude --- kiss/src/kiss/Prelude.hx | 35 +++++++++++++++++++++ projects/kiss-vscode/config/KissConfig.hx | 2 -- projects/kiss-vscode/config/KissConfig.kiss | 8 +---- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/kiss/src/kiss/Prelude.hx b/kiss/src/kiss/Prelude.hx index 3106e89b..0bcdfbaf 100644 --- a/kiss/src/kiss/Prelude.hx +++ b/kiss/src/kiss/Prelude.hx @@ -5,6 +5,14 @@ using Std; import kiss.Operand; import haxe.ds.Either; import haxe.Constraints; +#if (!macro && hxnodejs) +import js.node.ChildProcess; +import js.node.buffer.Buffer; +#elseif sys +import sys.io.Process; +#end + +using StringTools; /** What functions that process Lists should do when there are more elements than expected **/ enum ExtraElementHandling { @@ -267,4 +275,31 @@ class Prelude { #end return v; } + + /** + * On Sys targets and nodejs, Kiss can be converted to hscript at runtime + * 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. + */ + public static function convertToHScript(kissStr:String):String { + #if (!macro && hxnodejs) + var kissProcess = ChildProcess.spawnSync("haxelib", ["run", "kiss", "--all"], {input: '${kissStr}\n'}); + if (kissProcess.status != 0) { + var error:String = kissProcess.stderr; + throw 'failed to convert ${kissStr} to hscript: ${error}'; + } + var output:String = kissProcess.stdout; + return output; + #elseif sys + var kissProcess = new Process("haxelib", ["run", "kiss"]); + kissProcess.stdin.writeString('${kissStr.replace("\n", " ")}\n'); + var output = kissProcess.stdout.readLine(); + if (output.startsWith(">>> ")) { + output = output.substr(4); + } + return output; + #else + throw "Can't convert Kiss to HScript on this target."; + #end + } } diff --git a/projects/kiss-vscode/config/KissConfig.hx b/projects/kiss-vscode/config/KissConfig.hx index 53ee0069..d52e43f2 100644 --- a/projects/kiss-vscode/config/KissConfig.hx +++ b/projects/kiss-vscode/config/KissConfig.hx @@ -6,8 +6,6 @@ import kiss.Operand; import kiss.Stream; import vscode.*; import js.lib.Promise; -import js.node.ChildProcess; -import js.node.buffer.Buffer; import hscript.Parser; import hscript.Interp; import hscript.Expr; diff --git a/projects/kiss-vscode/config/KissConfig.kiss b/projects/kiss-vscode/config/KissConfig.kiss index e1bb9940..bfc21551 100644 --- a/projects/kiss-vscode/config/KissConfig.kiss +++ b/projects/kiss-vscode/config/KissConfig.kiss @@ -58,17 +58,11 @@ * Functionality */ -(defun :String convertToHScript [kissStr] - (let [kissProcess (ChildProcess.spawnSync "haxelib" ["run" "kiss" "--all"] (object input "${kissStr}\n"))] - (if !(= kissProcess.status 0) - {(errorMessage "failed to compile ${kissStr}: $(.toString (the Buffer .stderr kissProcess))") ""} - (.toString (the Buffer .stdout kissProcess))))) - (defun :Dynamic evalString [:String kissStr] (try (interp.execute (parser.parseString - (convertToHScript kissStr))) + (Prelude.convertToHScript kissStr))) (catch [e] (errorMessage "Error `${e}` from $kissStr") null)))