From b167eeab4873e51a41f8ba80ce9ff6335eb7f367 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Fri, 28 Apr 2023 08:17:00 -0600 Subject: [PATCH] port libPath and convertToHScript for lix --- build-scripts/common-args.hxml | 3 +-- build.hxml | 5 +++-- src/kiss/AsyncEmbeddedScript.hx | 3 ++- src/kiss/CompilerTools.hx | 4 ++-- src/kiss/Helpers.hx | 40 +++++++++++++++++++++++++++++++++ src/kiss/Kiss.hx | 3 ++- src/kiss/Macros.hx | 9 +++++++- src/kiss/Prelude.hx | 18 ++++++++------- 8 files changed, 68 insertions(+), 17 deletions(-) diff --git a/build-scripts/common-args.hxml b/build-scripts/common-args.hxml index 9f3797a..980b44c 100644 --- a/build-scripts/common-args.hxml +++ b/build-scripts/common-args.hxml @@ -5,7 +5,6 @@ -lib tink_json -lib tink_syntaxhub -lib haxe-strings --cp kiss/src --cp cloner/src +-cp src -D analyzer-optimize --macro kiss.KissFrontend.use() \ No newline at end of file diff --git a/build.hxml b/build.hxml index 3ad992f..e0fbf1b 100644 --- a/build.hxml +++ b/build.hxml @@ -2,5 +2,6 @@ -lib hscript -lib uuid -lib tink_macro ---main kiss.Main ---interp \ No newline at end of file +-lib tink_syntaxhub +-lib haxe-strings +--run kiss.Main \ No newline at end of file diff --git a/src/kiss/AsyncEmbeddedScript.hx b/src/kiss/AsyncEmbeddedScript.hx index fca4688..62ced84 100644 --- a/src/kiss/AsyncEmbeddedScript.hx +++ b/src/kiss/AsyncEmbeddedScript.hx @@ -6,6 +6,7 @@ import haxe.macro.Context; import haxe.macro.PositionTools; import sys.io.File; import haxe.io.Path; +import kiss.Helpers; using kiss.Helpers; #end @@ -166,7 +167,7 @@ class AsyncEmbeddedScript { } if (dslHaxelib.length > 0) { - dslFile = Path.join([Prelude.libPath(dslHaxelib), dslFile]); + dslFile = Path.join([Helpers.libPath(dslHaxelib), dslFile]); } // This brings in the DSL's functions and global variables. diff --git a/src/kiss/CompilerTools.hx b/src/kiss/CompilerTools.hx index 5aa2650..aede532 100644 --- a/src/kiss/CompilerTools.hx +++ b/src/kiss/CompilerTools.hx @@ -82,7 +82,7 @@ class CompilerTools { var classPathFolders = classPath.split("/"); while (classPathFolders.length > 0) { try { - Prelude.libPath(classPathFolders[classPathFolders.length - 1]); + Helpers.libPath(classPathFolders[classPathFolders.length - 1]); break; } catch (e) { classPathFolders.pop(); @@ -116,7 +116,7 @@ class CompilerTools { var haxelibRepositoryPath = haxelibSetupOutput.substr(haxelibSetupOutput.indexOf(messageBeforePath)).replace(messageBeforePath, ""); var mainHxFile = "ExternMain.hx"; - copyToFolder(mainHxFile, Path.join([Prelude.libPath("kiss"), "src", "kiss"])); + copyToFolder(mainHxFile, Path.join([Helpers.libPath("kiss"), "src", "kiss"])); var mainClassName = mainHxFile.withoutDirectory().withoutExtension(); diff --git a/src/kiss/Helpers.hx b/src/kiss/Helpers.hx index ae28481..426ad53 100644 --- a/src/kiss/Helpers.hx +++ b/src/kiss/Helpers.hx @@ -14,6 +14,8 @@ import kiss.Prelude; import kiss.cloner.Cloner; import uuid.Uuid; import sys.io.Process; +import sys.FileSystem; +import haxe.io.Path; using uuid.Uuid; using tink.MacroApi; @@ -843,4 +845,42 @@ class Helpers { throw KissError.fromExp(exp, '${description} should resolve at compile-time to a string literal of ${description2}'); } } + + // Get the path to a haxelib the program depends on + public static function libPath(haxelibName:String) { + var classPaths = Context.getClassPath(); + + for (dir in classPaths) { + var parts = Path.normalize(dir).split("/"); + var matchingPartIndex = parts.indexOf(haxelibName); + + + if (matchingPartIndex != -1) { + var path = parts.slice(0, matchingPartIndex + 1).join("/"); + + // TODO support all possible classPath formats: + + // / + if (FileSystem.exists(Path.join([path, "haxelib.json"]))) return path; + + // //haxelib/ + if (parts[matchingPartIndex + 2] == "haxelib") { + var haxelibPath = parts.slice(0, matchingPartIndex + 3).join("/"); + if (FileSystem.exists(Path.join([haxelibPath, "haxelib.json"]))) return haxelibPath; + } + + // //github// + if (parts[matchingPartIndex + 2] == "github") { + var githubPath = parts.slice(0, matchingPartIndex + 4).join("/"); + if (FileSystem.exists(Path.join([githubPath, "haxelib.json"]))) return githubPath; + } + } + } + + // Special case fallback: kiss when its classpath is "src" + if (haxelibName == "kiss") return Path.directory(Sys.getEnv("KISS_BUILD_HXML")); + + throw 'Could not find haxelib $haxelibName in class paths'; + } + } diff --git a/src/kiss/Kiss.hx b/src/kiss/Kiss.hx index a250470..d783410 100644 --- a/src/kiss/Kiss.hx +++ b/src/kiss/Kiss.hx @@ -75,6 +75,8 @@ typedef KissState = { class Kiss { #if macro public static function defaultKissState(?context:FrontendContext):KissState { + Sys.putEnv("KISS_BUILD_HXML", Prelude.joinPath(Helpers.libPath("kiss"), "build.hxml")); + var className = ""; var pack = []; if (context == null) { @@ -124,7 +126,6 @@ class Kiss { "enumerate" => Symbol("Prelude.enumerate"), "assertProcess" => Symbol("Prelude.assertProcess"), "tryProcess" => Symbol("Prelude.tryProcess"), - "libPath" => Symbol("Prelude.libPath"), "userHome" => Symbol("Prelude.userHome"), "random" => Symbol("Std.random"), "walkDirectory" => Symbol("Prelude.walkDirectory"), diff --git a/src/kiss/Macros.hx b/src/kiss/Macros.hx index 2263f94..e381751 100644 --- a/src/kiss/Macros.hx +++ b/src/kiss/Macros.hx @@ -6,6 +6,7 @@ import kiss.Reader; import kiss.ReaderExp; import kiss.Kiss; import kiss.KissError; +import kiss.Helpers; import kiss.CompilerTools; import uuid.Uuid; import hscript.Parser; @@ -44,10 +45,16 @@ class Macros { Kiss.load(compileTimeResolveToString("The only argument to (load...)", "a .kiss file path", args[0], k), k, null, false, wholeExp); }; + k.doc("libPath", 1, 1, '(libPath )'); + macros["libPath"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { + var b = wholeExp.expBuilder(); + return b.str(Helpers.libPath(compileTimeResolveToString("The only argument to (libPath...)", "a haxelib dependency name", args[0], k))); + }; + k.doc("loadFrom", 2, 2, '(loadFrom "" "")'); macros["loadFrom"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { var libName = compileTimeResolveToString("The first argument to (loadFrom...)", "a haxe library's name", args[0], k); - var libPath = Prelude.libPath(libName); + var libPath = Helpers.libPath(libName); var otherKissFile = compileTimeResolveToString("The second argument to (loadFrom...)", "a .kiss file path", args[1], k); Kiss.load(otherKissFile, k, libPath, false, wholeExp); }; diff --git a/src/kiss/Prelude.hx b/src/kiss/Prelude.hx index d6a426e..fa6210d 100644 --- a/src/kiss/Prelude.hx +++ b/src/kiss/Prelude.hx @@ -586,12 +586,14 @@ class Prelude { * So don't use raw string literals in Kiss you want parsed and evaluated at runtime. */ public static function convertToHScript(kissStr:String):String { + var buildHxml = Sys.getEnv("KISS_BUILD_HXML"); + var cwd = Path.directory(buildHxml); #if macro return Kiss.measure("Prelude.convertToHScript", () -> { #end #if (!macro && hxnodejs) var hscript = try { - assertProcess("haxelib", ["run", "kiss", "convert", "--all", "--hscript"], kissStr.split('\n')); + assertProcess("haxe", [buildHxml, "convert", "--all", "--hscript"], kissStr.split('\n'), true, cwd); } catch (e) { throw 'failed to convert ${kissStr} to hscript:\n$e'; } @@ -601,7 +603,7 @@ class Prelude { return hscript.trim(); #elseif (!macro && python) var hscript = try { - assertProcess("haxelib", ["run", "kiss", "convert", "--hscript"], [kissStr.replace('\n', ' ')], false); + assertProcess("haxe", [buildHxml, "convert", "--hscript"], [kissStr.replace('\n', ' ')], false, cwd); } catch (e) { throw 'failed to convert ${kissStr} to hscript:\n$e'; } @@ -610,8 +612,11 @@ class Prelude { } return hscript.trim(); #elseif sys + var oldCwd = Sys.getCwd(); + Sys.setCwd(cwd); + if (kissProcess == null) - kissProcess = new Process("haxelib", ["run", "kiss", "convert", "--hscript"]); + kissProcess = new Process("haxe", [buildHxml, "convert", "--hscript"]); kissProcess.stdin.writeString('${kissStr.replace("\n", " ")}\n'); @@ -620,9 +625,11 @@ class Prelude { if (output.startsWith(">>> ")) { output = output.substr(4); } + Sys.setCwd(oldCwd); return output; } catch (e) { var error = kissProcess.stderr.readAll().toString(); + Sys.setCwd(oldCwd); throw 'failed to convert ${kissStr} to hscript: ${error}'; } #else @@ -786,11 +793,6 @@ class Prelude { #end } - // Get the path to a haxelib the user has installed - public static function libPath(haxelibName:String) { - return assertProcess("haxelib", ["libpath", haxelibName]).trim(); - } - #if target.threaded static var shellCountMutex = new Mutex(); #end