From 7e4ab8c9cc90f457b86a674a2db511c2dd427a99 Mon Sep 17 00:00:00 2001 From: Alan Zimmerman Date: Sun, 26 Jan 2025 14:05:51 +0000 Subject: [PATCH] lsp-rust: honour :environment for runnables This means the new `Update Tests (Expect)` can work as intended. --- CHANGELOG.org | 1 + clients/lsp-rust.el | 8 +++++++- lsp-protocol.el | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.org b/CHANGELOG.org index 04d95b63ef..8bcc6f288b 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -29,6 +29,7 @@ * Add ~lsp-bash-allowed-shells~ to configure supported ~sh-shell~ values. * Add hint about ~activation-fn~ for unsupported buffers. * Add Roc support + * Add support for environment variables in rust analyzer runnables. Allowing the new ~Update Tests (Expect)~ code lens to work as expected. ** 9.0.0 * Add language server config for QML (Qt Modeling Language) using qmlls. diff --git a/clients/lsp-rust.el b/clients/lsp-rust.el index f1a8219d78..016a494b2b 100644 --- a/clients/lsp-rust.el +++ b/clients/lsp-rust.el @@ -1505,12 +1505,13 @@ such as imports and dyn traits." Extract the arguments, prepare the minor mode (cargo-process-mode if possible) and run a compilation" (-let* (((&rust-analyzer:Runnable :kind :label :args) runnable) - ((&rust-analyzer:RunnableArgs :cargo-args :executable-args :workspace-root? :expect-test?) args) + ((&rust-analyzer:RunnableArgs :cargo-args :executable-args :workspace-root? :expect-test? :environment?) args) (default-directory (or workspace-root? default-directory))) (if (not (string-equal kind "cargo")) (lsp--error "'%s' runnable is not supported" kind) (compilation-start (string-join (append (when expect-test? '("env" "UPDATE_EXPECT=1")) + (when environment? (lsp-rust-analyzer--to-bash-env environment?)) (list "cargo") cargo-args (when executable-args '("--")) executable-args '()) " ") @@ -1518,6 +1519,11 @@ and run a compilation" (if (functionp 'cargo-process-mode) 'cargo-process-mode nil) (lambda (_) (concat "*" label "*")))))) +(defun lsp-rust-analyzer--to-bash-env (env-vars) + "Extract the environment variables from plist ENV-VARS." + (cl-loop for (key value) on env-vars by 'cddr + collect (format "%s=%s" (substring (symbol-name key) 1) value))) + (defun lsp-rust-analyzer-run (runnable) "Select and run a RUNNABLE action." (interactive (list (lsp-rust-analyzer--select-runnable))) diff --git a/lsp-protocol.el b/lsp-protocol.el index 91c06c542d..361aed45af 100644 --- a/lsp-protocol.el +++ b/lsp-protocol.el @@ -449,7 +449,7 @@ See `-let' for a description of the destructuring mechanism." (rust-analyzer:MoveItemParams (:textDocument :range :direction) nil) (rust-analyzer:RunnablesParams (:textDocument) (:position)) (rust-analyzer:Runnable (:label :kind :args) (:location)) - (rust-analyzer:RunnableArgs (:cargoArgs :executableArgs) (:workspaceRoot :expectTest)) + (rust-analyzer:RunnableArgs (:cargoArgs :executableArgs) (:workspaceRoot :expectTest :environment)) (rust-analyzer:RelatedTestsParams (:textDocument :position) nil) (rust-analyzer:RelatedTests (:runnable) nil) (rust-analyzer:SsrParams (:query :parseOnly) nil)