From 228d91f8e74762a798478c570887774acd6af1de Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sun, 17 Jan 2021 20:17:18 -0700 Subject: [PATCH] Kiss-Vscode can compile and load a Config.kiss --- kiss/src/kiss/Reader.hx | 1 + projects/kiss-vscode/.gitignore | 6 ++- projects/kiss-vscode/config/KissConfig.hx | 11 ++++ projects/kiss-vscode/config/KissConfig.kiss | 14 +++++ projects/kiss-vscode/config/build.hxml | 5 ++ .../kiss-vscode/config/default/Config.kiss | 2 + projects/kiss-vscode/config/default/args.hxml | 0 projects/kiss-vscode/config/default/import.hx | 1 + projects/kiss-vscode/src/Main.hx | 8 ++- projects/kiss-vscode/src/Main.kiss | 51 ++++++++++++++++--- 10 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 projects/kiss-vscode/config/KissConfig.hx create mode 100644 projects/kiss-vscode/config/KissConfig.kiss create mode 100644 projects/kiss-vscode/config/build.hxml create mode 100644 projects/kiss-vscode/config/default/Config.kiss create mode 100644 projects/kiss-vscode/config/default/args.hxml create mode 100644 projects/kiss-vscode/config/default/import.hx diff --git a/kiss/src/kiss/Reader.hx b/kiss/src/kiss/Reader.hx index c01716be..1e03abf7 100644 --- a/kiss/src/kiss/Reader.hx +++ b/kiss/src/kiss/Reader.hx @@ -151,6 +151,7 @@ class Reader { stream.startOfLine = false; else readFunction = chooseReadFunction(stream, k.readTable); + // This should never happen, because there is a readFunction for "": if (readFunction == null) throw 'No macro to read next expression'; diff --git a/projects/kiss-vscode/.gitignore b/projects/kiss-vscode/.gitignore index 65b4fb91..22440e66 100644 --- a/projects/kiss-vscode/.gitignore +++ b/projects/kiss-vscode/.gitignore @@ -1,2 +1,6 @@ bin -*.vsix \ No newline at end of file +*.vsix +config/config*.js +config/args.hxml +config/Config.kiss +config/import.hx \ No newline at end of file diff --git a/projects/kiss-vscode/config/KissConfig.hx b/projects/kiss-vscode/config/KissConfig.hx new file mode 100644 index 00000000..179033c9 --- /dev/null +++ b/projects/kiss-vscode/config/KissConfig.hx @@ -0,0 +1,11 @@ +package; + +import kiss.Kiss; +import kiss.Prelude; +import js.lib.Promise; + +typedef Command = (?String) -> Void; + +@:build(kiss.Kiss.build("Config.kiss")) +@:build(kiss.Kiss.build("KissConfig.kiss")) +class KissConfig {} diff --git a/projects/kiss-vscode/config/KissConfig.kiss b/projects/kiss-vscode/config/KissConfig.kiss new file mode 100644 index 00000000..3711c20b --- /dev/null +++ b/projects/kiss-vscode/config/KissConfig.kiss @@ -0,0 +1,14 @@ +(defvar :Map commands (new Map)) + +// TODO use quickpick to choose one +(defun callCommand [] (return)) + +(defun registerCommand [description command] + (dictSet commands description command)) + +(defun registerBuiltins [] + (return)) + +// Utility functions for VSCode actions +// TODO quickpick +/// TODO infoMessage \ No newline at end of file diff --git a/projects/kiss-vscode/config/build.hxml b/projects/kiss-vscode/config/build.hxml new file mode 100644 index 00000000..c715449e --- /dev/null +++ b/projects/kiss-vscode/config/build.hxml @@ -0,0 +1,5 @@ +args.hxml +-lib hxnodejs +-lib kiss +KissConfig +-js config.js \ No newline at end of file diff --git a/projects/kiss-vscode/config/default/Config.kiss b/projects/kiss-vscode/config/default/Config.kiss new file mode 100644 index 00000000..940883fc --- /dev/null +++ b/projects/kiss-vscode/config/default/Config.kiss @@ -0,0 +1,2 @@ +(defun init [] + (return)) \ No newline at end of file diff --git a/projects/kiss-vscode/config/default/args.hxml b/projects/kiss-vscode/config/default/args.hxml new file mode 100644 index 00000000..e69de29b diff --git a/projects/kiss-vscode/config/default/import.hx b/projects/kiss-vscode/config/default/import.hx new file mode 100644 index 00000000..e55eed8c --- /dev/null +++ b/projects/kiss-vscode/config/default/import.hx @@ -0,0 +1 @@ +package; diff --git a/projects/kiss-vscode/src/Main.hx b/projects/kiss-vscode/src/Main.hx index f30c1035..3fc61b78 100644 --- a/projects/kiss-vscode/src/Main.hx +++ b/projects/kiss-vscode/src/Main.hx @@ -1,9 +1,13 @@ import vscode.*; import Sys; -import sys.io.Process; -import kiss.Kiss; +import sys.io.File; +import sys.FileSystem; import kiss.Prelude; import haxe.io.Path; +import js.Node; +import js.node.ChildProcess; + +using StringTools; @:build(kiss.Kiss.build("src/Main.kiss")) class Main { diff --git a/projects/kiss-vscode/src/Main.kiss b/projects/kiss-vscode/src/Main.kiss index 9c723365..63d2c663 100644 --- a/projects/kiss-vscode/src/Main.kiss +++ b/projects/kiss-vscode/src/Main.kiss @@ -3,17 +3,54 @@ (or (Sys.getEnv "MSYSHOME") (Sys.getEnv "HOME") (Sys.getEnv "UserProfile")) ".kiss"])) -(defvar &mut activeConfigDir "") +(defun timeStamp [] + (.replace (.replace (.toString (Date.now)) ":" "-") " " "-")) -// (defun tryLoadConfig [&opt selectedText] - // ) +(defvar &mut activeConfigDir "") +(defvar &mut :Dynamic config null) + +(defun tryLoadConfig [&opt :String text] + (let [activeConfigPath (Path.join [activeConfigDir "config.js"]) + backupConfigPath (Path.join [activeConfigDir (+ "config" (timeStamp) ".js")])] + // Backup existing config.js + (when (FileSystem.exists activeConfigPath) + (FileSystem.rename activeConfigPath backupConfigPath)) + // Supply the default (empty) config if the user doesn't have one + (let [customConfigDir + (if (FileSystem.exists (userConfigDir)) + (userConfigDir) + (Path.join [activeConfigDir "default"])) + customConfigFiles + (FileSystem.readDirectory customConfigDir)] + // Copy the custom config files to the active config directory + (doFor file customConfigFiles + (File.copy + (Path.join [customConfigDir file]) + (Path.join [activeConfigDir file]))) + (let [buildResult + (ChildProcess.spawnSync "haxe" ["build.hxml"] (object cwd activeConfigDir))] + (if (and !buildResult.error (= 0 buildResult.status)) + // Successful compilation! require the config.js package + (begin + (set config (Node.require (Path.join [activeConfigDir "config.js"]))) + (Vscode.window.showInformationMessage "Config loaded successfully!")) + // If there's a build error, restore the config.js backup + (begin + (when (FileSystem.exists backupConfigPath) + (FileSystem.rename backupConfigPath activeConfigPath)) + (Vscode.window.showErrorMessage + (+ "Config failed to compile: " + (if buildResult.error + #| "" + buildResult.error|# + #| "" + buildResult.stderr |#))))))))) (defun _activate [:ExtensionContext context] - (set activeConfigDir (Path.join [context.extensionPath "config"])) - (print "yyooooo") - + // TODO command to call KissConfig.callCommand if config != null (context.subscriptions.push (Vscode.commands.registerCommand "kiss-vscode.sayHello" (lambda [] - (Vscode.window.showInformationMessage "Hello from Haxe!"))))) \ No newline at end of file + (Vscode.window.showInformationMessage "Hello from Haxe!")))) + + (set activeConfigDir (Path.join [context.extensionPath "config"])) + (tryLoadConfig))