]> git.lizzy.rs Git - rust.git/commitdiff
Add support of runnables arguments in Rust Analyzer
authorIgor Aleksanov <popzxc@yandex.ru>
Sat, 5 Sep 2020 09:52:27 +0000 (12:52 +0300)
committerIgor Aleksanov <popzxc@yandex.ru>
Fri, 2 Oct 2020 09:34:27 +0000 (12:34 +0300)
crates/rust-analyzer/src/config.rs
crates/rust-analyzer/src/handlers.rs
crates/rust-analyzer/src/lsp_ext.rs
crates/rust-analyzer/src/to_proto.rs

index 42e1ad376ce14f824998840a4b7eaad5bca7daa9..c5dd00706d52e7c6a4e31fb068590b7a8f51c32e 100644 (file)
@@ -38,6 +38,7 @@ pub struct Config {
     pub cargo: CargoConfig,
     pub rustfmt: RustfmtConfig,
     pub flycheck: Option<FlycheckConfig>,
+    pub runnables: RunnablesConfig,
 
     pub inlay_hints: InlayHintsConfig,
     pub completion: CompletionConfig,
@@ -124,6 +125,15 @@ pub enum RustfmtConfig {
     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,
@@ -164,6 +174,7 @@ pub fn new(root_path: AbsPathBuf) -> Self {
                 extra_args: Vec::new(),
                 features: Vec::new(),
             }),
+            runnables: RunnablesConfig::default(),
 
             inlay_hints: InlayHintsConfig {
                 type_hints: true,
@@ -220,6 +231,10 @@ pub fn update(&mut self, json: serde_json::Value) {
             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()]))
@@ -474,6 +489,9 @@ struct ConfigData {
         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,
 
index afcec63ad165c5d099aeb02e042f38e4d480bec6..2a8eca1460abec9a8454d6ae8b169d7652dce74f 100644 (file)
@@ -491,6 +491,7 @@ pub(crate) fn handle_runnables(
     }
 
     // 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() {
@@ -500,12 +501,14 @@ pub(crate) fn handle_runnables(
                     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,
                     },
@@ -519,7 +522,9 @@ pub(crate) fn handle_runnables(
                 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,
                 },
index 43ff191dab5182ddf5734e1bd5ea1409765ba731..72c4ebfd3c8dfe5378fa472dda7f4d1b6c5f71df 100644 (file)
@@ -171,10 +171,14 @@ pub enum RunnableKind {
 #[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")]
index 59e780b7d2e55156dfee9fffa56397e290685845..5dca520c30764769201754ff78b6421381d1c946 100644 (file)
@@ -740,6 +740,7 @@ pub(crate) fn runnable(
     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());
@@ -754,7 +755,9 @@ pub(crate) fn runnable(
         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,
         },