From 858858e8735077b70bf989f5ae96e851d1d2d675 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sun, 24 Jan 2021 13:41:14 -0700 Subject: [PATCH] Kiss VSCode runnable commands --- projects/kiss-vscode/config/KissConfig.hx | 4 +- projects/kiss-vscode/config/KissConfig.kiss | 50 ++++++++++++++++--- projects/kiss-vscode/config/build.hxml | 1 + .../kiss-vscode/config/example/Config.kiss | 8 +++ projects/kiss-vscode/config/example/args.hxml | 0 projects/kiss-vscode/config/example/import.hx | 1 + projects/kiss-vscode/package.json | 6 +-- projects/kiss-vscode/src/Main.hx | 11 +++- projects/kiss-vscode/src/Main.kiss | 16 ++++-- 9 files changed, 81 insertions(+), 16 deletions(-) create mode 100644 projects/kiss-vscode/config/example/Config.kiss create mode 100644 projects/kiss-vscode/config/example/args.hxml create mode 100644 projects/kiss-vscode/config/example/import.hx diff --git a/projects/kiss-vscode/config/KissConfig.hx b/projects/kiss-vscode/config/KissConfig.hx index 37cd7377..b661f8fd 100644 --- a/projects/kiss-vscode/config/KissConfig.hx +++ b/projects/kiss-vscode/config/KissConfig.hx @@ -2,9 +2,11 @@ package; import kiss.Kiss; import kiss.Prelude; +import vscode.*; import js.lib.Promise; -typedef Command = (?String) -> Void; +typedef Command = (String) -> Void; +@:expose @:build(kiss.Kiss.buildAll(["KissConfig.kiss", "Config.kiss"])) class KissConfig {} diff --git a/projects/kiss-vscode/config/KissConfig.kiss b/projects/kiss-vscode/config/KissConfig.kiss index 3711c20b..61e1a6cc 100644 --- a/projects/kiss-vscode/config/KissConfig.kiss +++ b/projects/kiss-vscode/config/KissConfig.kiss @@ -1,14 +1,52 @@ +/** + * Aliases + */ + +// output +(defalias &call infoMessage Vscode.window.showInformationMessage) +(defalias &call warningMessage Vscode.window.showWarningMessage) +(defalias &call errorMessage Vscode.window.showErrorMessage) + +// input +(defalias &call inputBox Vscode.window.showInputBox) +(defalias &call quickPick Vscode.window.showQuickPick) + +// ui +(defalias &ident activeTextEditor Vscode.window.activeTextEditor) + +/** + * Helper functions + */ +(defun selectedText [] + (if (and activeTextEditor .selection activeTextEditor) + (let [document + // TODO should be able to use activeTextEditor.document and have the alias still work + .document activeTextEditor + selection + .selection activeTextEditor + range (new Range selection.start selection.end)] + (document.getText range)) + "")) + +/** + * Functionality + */ (defvar :Map commands (new Map)) -// TODO use quickpick to choose one -(defun callCommand [] (return)) +(defun runCommand [] + (let [commandList + (for description (commands.keys) + (object + label description + description null + detail null + picked null + alwaysShow null))] + (awaitLet [chosenCommand (quickPick commandList)] + ((dictGet commands chosenCommand.label) (selectedText))))) (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 index c715449e..f9b02145 100644 --- a/projects/kiss-vscode/config/build.hxml +++ b/projects/kiss-vscode/config/build.hxml @@ -1,5 +1,6 @@ args.hxml -lib hxnodejs +-lib vscode -lib kiss KissConfig -js config.js \ No newline at end of file diff --git a/projects/kiss-vscode/config/example/Config.kiss b/projects/kiss-vscode/config/example/Config.kiss new file mode 100644 index 00000000..3d366b79 --- /dev/null +++ b/projects/kiss-vscode/config/example/Config.kiss @@ -0,0 +1,8 @@ +(defun init [] + (registerCommand "print a nice message" + (lambda [selectedText] + (infoMessage "Hello world!") + (when selectedText + (infoMessage (+ "Also, " selectedText))) + (return))) + (return)) \ No newline at end of file diff --git a/projects/kiss-vscode/config/example/args.hxml b/projects/kiss-vscode/config/example/args.hxml new file mode 100644 index 00000000..e69de29b diff --git a/projects/kiss-vscode/config/example/import.hx b/projects/kiss-vscode/config/example/import.hx new file mode 100644 index 00000000..e55eed8c --- /dev/null +++ b/projects/kiss-vscode/config/example/import.hx @@ -0,0 +1 @@ +package; diff --git a/projects/kiss-vscode/package.json b/projects/kiss-vscode/package.json index bace3a9e..b4793869 100644 --- a/projects/kiss-vscode/package.json +++ b/projects/kiss-vscode/package.json @@ -10,14 +10,14 @@ "Programming Languages" ], "activationEvents": [ - "onCommand:kiss-vscode.sayHello" + "onCommand:kiss.runCommand" ], "main": "bin/extension.js", "contributes": { "commands": [ { - "command": "kiss-vscode.sayHello", - "title": "Say Hello" + "command": "kiss.runCommand", + "title": "Kiss: Run a Kiss command" } ], "languages": [{ diff --git a/projects/kiss-vscode/src/Main.hx b/projects/kiss-vscode/src/Main.hx index 3fc61b78..f1587df3 100644 --- a/projects/kiss-vscode/src/Main.hx +++ b/projects/kiss-vscode/src/Main.hx @@ -9,9 +9,18 @@ import js.node.ChildProcess; using StringTools; +typedef Command = (String) -> Void; + +typedef KissConfig = { + registerBuiltins:() -> Void, + registerCommand:(String, Command) -> Void, + runCommand:() -> Void, + init:() -> Void +}; + @:build(kiss.Kiss.build("src/Main.kiss")) class Main { - // TODO support EMeta(s:MetadataEntry, e:Expr) via Kiss + // TODO support EMeta(s:MetadataEntry, e:Expr) via Kiss so this signature can be moved to Main.kiss @:expose("activate") static function activate(context:ExtensionContext) { _activate(context); diff --git a/projects/kiss-vscode/src/Main.kiss b/projects/kiss-vscode/src/Main.kiss index 63d2c663..93c698c1 100644 --- a/projects/kiss-vscode/src/Main.kiss +++ b/projects/kiss-vscode/src/Main.kiss @@ -32,7 +32,10 @@ (if (and !buildResult.error (= 0 buildResult.status)) // Successful compilation! require the config.js package (begin - (set config (Node.require (Path.join [activeConfigDir "config.js"]))) + (set config .KissConfig (Node.require (Path.join [activeConfigDir "config.js"]))) + (.registerBuiltins (the KissConfig config)) + (.registerCommand (the KissConfig config) "Reload Kiss config" tryLoadConfig) + (.init (the KissConfig config)) (Vscode.window.showInformationMessage "Config loaded successfully!")) // If there's a build error, restore the config.js backup (begin @@ -42,15 +45,18 @@ (+ "Config failed to compile: " (if buildResult.error #| "" + buildResult.error|# - #| "" + buildResult.stderr |#))))))))) + #| "" + buildResult.stderr |#)))))))) + (return)) (defun _activate [:ExtensionContext context] - // TODO command to call KissConfig.callCommand if config != null (context.subscriptions.push (Vscode.commands.registerCommand - "kiss-vscode.sayHello" + "kiss.runCommand" (lambda [] - (Vscode.window.showInformationMessage "Hello from Haxe!")))) + (if config + (.runCommand (the KissConfig config)) + (Vscode.window.showErrorMessage "Can't run commands! No config is loaded.")) + (return)))) (set activeConfigDir (Path.join [context.extensionPath "config"])) (tryLoadConfig))