mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Add environment to runnable lsp extension
This commit is contained in:
parent
f2afcb874e
commit
fcddcf2ee5
7 changed files with 85 additions and 33 deletions
|
@ -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(),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {}
|
||||||
|
|
|
@ -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(),
|
||||||
}),
|
}),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) => {
|
||||||
|
|
|
@ -13,6 +13,7 @@ function makeRunnable(label: string): ra.Runnable {
|
||||||
cwd: ".",
|
cwd: ".",
|
||||||
executableArgs: [],
|
executableArgs: [],
|
||||||
cargoExtraArgs: [],
|
cargoExtraArgs: [],
|
||||||
|
environment: {},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue