pub cargo: CargoConfig,
pub rustfmt: RustfmtConfig,
pub flycheck: Option<FlycheckConfig>,
+ pub runnables: RunnablesConfig,
pub inlay_hints: InlayHintsConfig,
pub completion: CompletionConfig,
CustomCommand { command: String, args: Vec<String> },
}
+/// Configuration for runnable items, such as `main` function or tests.
+#[derive(Debug, Clone, Default)]
+pub struct RunnablesConfig {
+ /// Stuff to be inserted before `cargo`, e.g. `RUST_LOG=info`.
+ pub cargo_prefix: Vec<String>,
+ /// Additional arguments for the `cargo`, e.g. `--release`.
+ pub cargo_extra_args: Vec<String>,
+}
+
#[derive(Debug, Clone, Default)]
pub struct ClientCapsConfig {
pub location_link: bool,
extra_args: Vec::new(),
features: Vec::new(),
}),
+ runnables: RunnablesConfig::default(),
inlay_hints: InlayHintsConfig {
type_hints: true,
load_out_dirs_from_check: data.cargo_loadOutDirsFromCheck,
target: data.cargo_target.clone(),
};
+ self.runnables = RunnablesConfig {
+ cargo_prefix: data.runnables_cargoPrefix,
+ cargo_extra_args: data.runnables_cargoExtraArgs,
+ };
self.proc_macro_srv = if data.procMacro_enable {
std::env::current_exe().ok().map(|path| (path, vec!["proc-macro".into()]))
notifications_cargoTomlNotFound: bool = true,
procMacro_enable: bool = false,
+ runnables_cargoPrefix: Vec<String> = Vec::new(),
+ runnables_cargoExtraArgs: Vec<String> = Vec::new(),
+
rustfmt_extraArgs: Vec<String> = Vec::new(),
rustfmt_overrideCommand: Option<Vec<String>> = None,
}
// Add `cargo check` and `cargo test` for all targets of the whole package
+ let config = &snap.config.runnables;
match cargo_spec {
Some(spec) => {
for &cmd in ["check", "test"].iter() {
kind: lsp_ext::RunnableKind::Cargo,
args: lsp_ext::CargoRunnable {
workspace_root: Some(spec.workspace_root.clone().into()),
+ cargo_prefix: config.cargo_prefix.clone(),
cargo_args: vec![
cmd.to_string(),
"--package".to_string(),
spec.package.clone(),
"--all-targets".to_string(),
],
+ cargo_extra_args: config.cargo_extra_args.clone(),
executable_args: Vec::new(),
expect_test: None,
},
kind: lsp_ext::RunnableKind::Cargo,
args: lsp_ext::CargoRunnable {
workspace_root: None,
+ cargo_prefix: config.cargo_prefix.clone(),
cargo_args: vec!["check".to_string(), "--workspace".to_string()],
+ cargo_extra_args: config.cargo_extra_args.clone(),
executable_args: Vec::new(),
expect_test: None,
},
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CargoRunnable {
+ // stuff before `cargo` command, e.g. `RUST_LOG=info`
+ pub cargo_prefix: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace_root: Option<PathBuf>,
// command, --package and --lib stuff
pub cargo_args: Vec<String>,
+ // user-specified additional cargo args, like `--release`.
+ pub cargo_extra_args: Vec<String>,
// stuff after --
pub executable_args: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
file_id: FileId,
runnable: Runnable,
) -> Result<lsp_ext::Runnable> {
+ let config = &snap.config.runnables;
let spec = CargoTargetSpec::for_file(snap, file_id)?;
let workspace_root = spec.as_ref().map(|it| it.workspace_root.clone());
let target = spec.as_ref().map(|s| s.target.clone());
kind: lsp_ext::RunnableKind::Cargo,
args: lsp_ext::CargoRunnable {
workspace_root: workspace_root.map(|it| it.into()),
+ cargo_prefix: config.cargo_prefix.clone(),
cargo_args,
+ cargo_extra_args: config.cargo_extra_args.clone(),
executable_args,
expect_test: None,
},