about summary refs log tree commit diff
diff options
context:
space:
mode:
authorClSlaid <cailue@bupt.edu.cn>2023-12-04 21:08:29 +0800
committerClSlaid <cailue@bupt.edu.cn>2023-12-04 21:08:29 +0800
commitb21d68cd2ab828faee4f49c43bb37fe444561def (patch)
tree6dca9f4513b84f8aee761f79aff796422482dc28
parente402c494b7c7d94a37c6d789a216187aaf9ccd3e (diff)
downloadrust-b21d68cd2ab828faee4f49c43bb37fe444561def.tar.gz
rust-b21d68cd2ab828faee4f49c43bb37fe444561def.zip
feat: add proc-macro rebuild on save option
Signed-off-by: ClSlaid <cailue@bupt.edu.cn>
-rw-r--r--crates/rust-analyzer/src/config.rs7
-rw-r--r--crates/rust-analyzer/src/global_state.rs4
2 files changed, 11 insertions, 0 deletions
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index 90d1d6b0555..33ba4662369 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -105,6 +105,9 @@ config_data! {
         /// ```
         /// .
         cargo_buildScripts_overrideCommand: Option<Vec<String>> = "null",
+        /// rerun proc-macros building/build-scripts running when proc-macro
+        /// or build-script sources change and are saved.
+        cargo_buildScripts_rebuildOnSave: bool = "false",
         /// Use `RUSTC_WRAPPER=rust-analyzer` when running build scripts to
         /// avoid checking unnecessary things.
         cargo_buildScripts_useRustcWrapper: bool = "true",
@@ -1368,6 +1371,10 @@ impl Config {
         self.data.checkOnSave
     }
 
+    pub fn script_rebuild_on_save(&self) -> bool {
+        self.data.cargo_buildScripts_rebuildOnSave
+    }
+
     pub fn runnables(&self) -> RunnablesConfig {
         RunnablesConfig {
             override_cargo: self.data.runnables_command.clone(),
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs
index c09f57252ce..60dc5dc5221 100644
--- a/crates/rust-analyzer/src/global_state.rs
+++ b/crates/rust-analyzer/src/global_state.rs
@@ -351,6 +351,10 @@ impl GlobalState {
 
                     crates.iter().any(|&krate| crate_graph[krate].is_proc_macro)
                 });
+            if self.proc_macro_changed && self.config.script_rebuild_on_save() {
+                self.fetch_build_data_queue
+                    .request_op(format!("proc-macro or build script source changed"), ())
+            }
         }
 
         true