Add environment to runnable lsp extension

This commit is contained in:
Lukas Wirth 2024-07-06 16:15:06 +02:00
parent f2afcb874e
commit fcddcf2ee5
7 changed files with 85 additions and 33 deletions

View file

@ -847,7 +847,7 @@ pub(crate) fn handle_runnables(
if expect_test { if expect_test {
if let lsp_ext::RunnableArgs::Cargo(r) = &mut runnable.args { if let lsp_ext::RunnableArgs::Cargo(r) = &mut runnable.args {
runnable.label = format!("{} + expect", runnable.label); runnable.label = format!("{} + expect", runnable.label);
r.expect_test = Some(true); r.environment.insert("UPDATE_EXPECT".to_owned(), "1".to_owned());
} }
} }
res.push(runnable); res.push(runnable);
@ -884,12 +884,12 @@ pub(crate) fn handle_runnables(
kind: lsp_ext::RunnableKind::Cargo, kind: lsp_ext::RunnableKind::Cargo,
args: lsp_ext::RunnableArgs::Cargo(lsp_ext::CargoRunnableArgs { args: lsp_ext::RunnableArgs::Cargo(lsp_ext::CargoRunnableArgs {
workspace_root: Some(spec.workspace_root.clone().into()), workspace_root: Some(spec.workspace_root.clone().into()),
cwd: Some(cwd.into()), cwd: cwd.into(),
override_cargo: config.override_cargo.clone(), override_cargo: config.override_cargo.clone(),
cargo_args, cargo_args,
cargo_extra_args: config.cargo_extra_args.clone(), cargo_extra_args: config.cargo_extra_args.clone(),
executable_args: Vec::new(), executable_args: Vec::new(),
expect_test: None, environment: Default::default(),
}), }),
}) })
} }
@ -903,12 +903,12 @@ pub(crate) fn handle_runnables(
kind: lsp_ext::RunnableKind::Cargo, kind: lsp_ext::RunnableKind::Cargo,
args: lsp_ext::RunnableArgs::Cargo(lsp_ext::CargoRunnableArgs { args: lsp_ext::RunnableArgs::Cargo(lsp_ext::CargoRunnableArgs {
workspace_root: None, workspace_root: None,
cwd: None, cwd: ".".into(),
override_cargo: config.override_cargo, override_cargo: config.override_cargo,
cargo_args: vec!["check".to_owned(), "--workspace".to_owned()], cargo_args: vec!["check".to_owned(), "--workspace".to_owned()],
cargo_extra_args: config.cargo_extra_args, cargo_extra_args: config.cargo_extra_args,
executable_args: Vec::new(), executable_args: Vec::new(),
expect_test: None, environment: Default::default(),
}), }),
}); });
} }

View file

@ -460,28 +460,27 @@ pub enum RunnableKind {
#[derive(Deserialize, Serialize, Debug)] #[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct CargoRunnableArgs { pub struct CargoRunnableArgs {
// command to be executed instead of cargo pub environment: FxHashMap<String, String>,
pub cwd: Utf8PathBuf,
/// Command to be executed instead of cargo
pub override_cargo: Option<String>, pub override_cargo: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub workspace_root: Option<Utf8PathBuf>, pub workspace_root: Option<Utf8PathBuf>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cwd: Option<Utf8PathBuf>,
// command, --package and --lib stuff // command, --package and --lib stuff
pub cargo_args: Vec<String>, pub cargo_args: Vec<String>,
// user-specified additional cargo args, like `--release`. // user-specified additional cargo args, like `--release`.
pub cargo_extra_args: Vec<String>, pub cargo_extra_args: Vec<String>,
// stuff after -- // stuff after --
pub executable_args: Vec<String>, pub executable_args: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expect_test: Option<bool>,
} }
#[derive(Deserialize, Serialize, Debug)] #[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct ShellRunnableArgs { pub struct ShellRunnableArgs {
pub environment: FxHashMap<String, String>,
pub cwd: Utf8PathBuf,
pub program: String, pub program: String,
pub args: Vec<String>, pub args: Vec<String>,
pub cwd: Utf8PathBuf,
} }
pub enum RelatedTests {} pub enum RelatedTests {}

View file

@ -15,7 +15,7 @@ use ide::{
}; };
use ide_db::{rust_doc::format_docs, FxHasher}; use ide_db::{rust_doc::format_docs, FxHasher};
use itertools::Itertools; use itertools::Itertools;
use paths::{Utf8Component, Utf8Prefix}; use paths::{Utf8Component, Utf8PathBuf, Utf8Prefix};
use semver::VersionReq; use semver::VersionReq;
use serde_json::to_value; use serde_json::to_value;
use vfs::AbsPath; use vfs::AbsPath;
@ -1390,10 +1390,10 @@ pub(crate) fn runnable(
workspace_root: Some(workspace_root.into()), workspace_root: Some(workspace_root.into()),
override_cargo: config.override_cargo, override_cargo: config.override_cargo,
cargo_args, cargo_args,
cwd: Some(cwd.into()), cwd: cwd.into(),
cargo_extra_args: config.cargo_extra_args, cargo_extra_args: config.cargo_extra_args,
executable_args, executable_args,
expect_test: None, environment: Default::default(),
}), }),
})) }))
} }
@ -1407,6 +1407,7 @@ pub(crate) fn runnable(
program: json_shell_runnable_args.program, program: json_shell_runnable_args.program,
args: json_shell_runnable_args.args, args: json_shell_runnable_args.args,
cwd: json_shell_runnable_args.cwd, cwd: json_shell_runnable_args.cwd,
environment: Default::default(),
}; };
Ok(Some(lsp_ext::Runnable { Ok(Some(lsp_ext::Runnable {
label, label,
@ -1433,10 +1434,10 @@ pub(crate) fn runnable(
workspace_root: None, workspace_root: None,
override_cargo: config.override_cargo, override_cargo: config.override_cargo,
cargo_args, cargo_args,
cwd: None, cwd: Utf8PathBuf::from("."),
cargo_extra_args: config.cargo_extra_args, cargo_extra_args: config.cargo_extra_args,
executable_args, executable_args,
expect_test: None, environment: Default::default(),
}), }),
})) }))
} }

View file

@ -1,5 +1,5 @@
<!--- <!---
lsp/ext.rs hash: 8e6e340f2899b5e9 lsp/ext.rs hash: 3605fab9e66e14a0
If you need to change the above hash to make the test pass, please check if you If you need to change the above hash to make the test pass, please check if you
need to adjust this doc as well and ping this issue: need to adjust this doc as well and ping this issue:
@ -376,12 +376,34 @@ rust-analyzer supports two `kind`s of runnables, `"cargo"` and `"shell"`. The `a
```typescript ```typescript
{ {
/**
* Environment variables to set before running the command.
*/
environment: Record<string, string>;
/**
* The working directory to run the command in.
*/
cwd: string;
/**
* The workspace root directory of the cargo project.
*/
workspaceRoot?: string; workspaceRoot?: string;
cwd?: string; /**
* The cargo command to run.
*/
cargoArgs: string[]; cargoArgs: string[];
/**
* Extra arguments to pass to cargo.
*/
// What is the point of this when cargoArgs exists?
cargoExtraArgs: string[]; cargoExtraArgs: string[];
/**
* Arguments to pass to the executable, these will be passed to the command after a `--` argument.
*/
executableArgs: string[]; executableArgs: string[];
expectTest?: boolean; /**
* Command to execute instead of `cargo`.
*/
overrideCargo?: string; overrideCargo?: string;
} }
``` ```
@ -390,10 +412,17 @@ The args for `"shell"` look like this:
```typescript ```typescript
{ {
/**
* Environment variables to set before running the command.
*/
environment: Record<string, string>;
/**
* The working directory to run the command in.
*/
cwd: string;
kind: string; kind: string;
program: string; program: string;
args: string[]; args: string[];
cwd: string;
} }
``` ```

View file

@ -235,22 +235,46 @@ type RunnableShell = {
args: ShellRunnableArgs; args: ShellRunnableArgs;
}; };
export type CommonRunnableArgs = {
/**
* Environment variables to set before running the command.
*/
environment: Record<string, string>;
/**
* The working directory to run the command in.
*/
cwd: string;
};
export type ShellRunnableArgs = { export type ShellRunnableArgs = {
kind: string; kind: string;
program: string; program: string;
args: string[]; args: string[];
cwd: string; } & CommonRunnableArgs;
};
export type CargoRunnableArgs = { export type CargoRunnableArgs = {
/**
* The workspace root directory of the cargo project.
*/
workspaceRoot?: string; workspaceRoot?: string;
/**
* The cargo command to run.
*/
cargoArgs: string[]; cargoArgs: string[];
cwd: string; /**
* Extra arguments to pass to cargo.
*/
// What is the point of this when cargoArgs exists?
cargoExtraArgs: string[]; cargoExtraArgs: string[];
/**
* Arguments to pass to the executable, these will be passed to the command after a `--` argument.
*/
executableArgs: string[]; executableArgs: string[];
expectTest?: boolean; /**
* Command to execute instead of `cargo`.
*/
overrideCargo?: string; overrideCargo?: string;
}; } & CommonRunnableArgs;
export type RunnablesParams = { export type RunnablesParams = {
textDocument: lc.TextDocumentIdentifier; textDocument: lc.TextDocumentIdentifier;

View file

@ -66,9 +66,12 @@ export class RunnableQuickPick implements vscode.QuickPickItem {
} }
} }
export function prepareBaseEnv(): Record<string, string> { export function prepareBaseEnv(base?: Record<string, string>): Record<string, string> {
const env: Record<string, string> = { RUST_BACKTRACE: "short" }; const env: Record<string, string> = { RUST_BACKTRACE: "short" };
Object.assign(env, process.env as { [key: string]: string }); Object.assign(env, process.env);
if (base) {
Object.assign(env, base);
}
return env; return env;
} }
@ -77,12 +80,7 @@ export function prepareEnv(
runnableArgs: ra.CargoRunnableArgs, runnableArgs: ra.CargoRunnableArgs,
runnableEnvCfg: RunnableEnvCfg, runnableEnvCfg: RunnableEnvCfg,
): Record<string, string> { ): Record<string, string> {
const env = prepareBaseEnv(); const env = prepareBaseEnv(runnableArgs.environment);
if (runnableArgs.expectTest) {
env["UPDATE_EXPECT"] = "1";
}
const platform = process.platform; const platform = process.platform;
const checkPlatform = (it: RunnableEnvCfgItem) => { const checkPlatform = (it: RunnableEnvCfgItem) => {

View file

@ -13,6 +13,7 @@ function makeRunnable(label: string): ra.Runnable {
cwd: ".", cwd: ".",
executableArgs: [], executableArgs: [],
cargoExtraArgs: [], cargoExtraArgs: [],
environment: {},
}, },
}; };
} }