Unnamed repository; edit this file 'description' to name the repository.
Auto merge of #16616 - Veykril:build-script-fix, r=Veykril
fix: server hanging up on build script task This should fix https://github.com/rust-lang/rust-analyzer/issues/16614, can't say for certain since it might be not 100% reproducible... We really need to replace the current workspace fetching logic, it is completely unreadable and incredibly difficult to follow. I don't really understand how the server even got to hang here honestly (I would expect it to loop re-fetching build scripts, but not hang).
bors 2024-02-20
parent c888724 · parent 9dee352 · commit 9f04957
-rw-r--r--crates/rust-analyzer/src/global_state.rs20
-rw-r--r--crates/rust-analyzer/src/lsp/utils.rs1
-rw-r--r--crates/rust-analyzer/src/reload.rs7
3 files changed, 7 insertions, 21 deletions
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs
index 293807a383..b2d507491b 100644
--- a/crates/rust-analyzer/src/global_state.rs
+++ b/crates/rust-analyzer/src/global_state.rs
@@ -301,19 +301,12 @@ impl GlobalState {
if let Some(path) = vfs_path.as_path() {
let path = path.to_path_buf();
if reload::should_refresh_for_change(&path, file.kind()) {
- workspace_structure_change = Some((
- path.clone(),
- false,
- AsRef::<std::path::Path>::as_ref(&path).ends_with("build.rs"),
- ));
+ workspace_structure_change = Some((path.clone(), false));
}
if file.is_created_or_deleted() {
has_structure_changes = true;
- workspace_structure_change = Some((
- path,
- self.crate_graph_file_dependencies.contains(vfs_path),
- false,
- ));
+ workspace_structure_change =
+ Some((path, self.crate_graph_file_dependencies.contains(vfs_path)));
} else if path.extension() == Some("rs".as_ref()) {
modified_rust_files.push(file.file_id);
}
@@ -365,16 +358,11 @@ impl GlobalState {
// FIXME: ideally we should only trigger a workspace fetch for non-library changes
// but something's going wrong with the source root business when we add a new local
// crate see https://github.com/rust-lang/rust-analyzer/issues/13029
- if let Some((path, force_crate_graph_reload, build_scripts_touched)) =
- workspace_structure_change
- {
+ if let Some((path, force_crate_graph_reload)) = workspace_structure_change {
self.fetch_workspaces_queue.request_op(
format!("workspace vfs file change: {path}"),
force_crate_graph_reload,
);
- if build_scripts_touched {
- self.fetch_build_data_queue.request_op(format!("build.rs changed: {path}"), ());
- }
}
}
diff --git a/crates/rust-analyzer/src/lsp/utils.rs b/crates/rust-analyzer/src/lsp/utils.rs
index 10335cb145..800c0eee53 100644
--- a/crates/rust-analyzer/src/lsp/utils.rs
+++ b/crates/rust-analyzer/src/lsp/utils.rs
@@ -134,6 +134,7 @@ impl GlobalState {
let token = lsp_types::ProgressToken::String(
cancel_token.unwrap_or_else(|| format!("rustAnalyzer/{title}")),
);
+ tracing::debug!(?token, ?state, "report_progress {message:?}");
let work_done_progress = match state {
Progress::Begin => {
self.send_request::<lsp_types::request::WorkDoneProgressCreate>(
diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs
index 5895459d1f..00494ca5ba 100644
--- a/crates/rust-analyzer/src/reload.rs
+++ b/crates/rust-analyzer/src/reload.rs
@@ -411,10 +411,7 @@ impl GlobalState {
if *force_reload_crate_graph {
self.recreate_crate_graph(cause);
}
- if self.build_deps_changed && self.config.run_build_scripts() {
- self.build_deps_changed = false;
- self.fetch_build_data_queue.request_op("build_deps_changed".to_owned(), ());
- }
+
// Current build scripts do not match the version of the active
// workspace, so there's nothing for us to update.
return;
@@ -424,7 +421,7 @@ impl GlobalState {
// Here, we completely changed the workspace (Cargo.toml edit), so
// we don't care about build-script results, they are stale.
- // FIXME: can we abort the build scripts here?
+ // FIXME: can we abort the build scripts here if they are already running?
self.workspaces = Arc::new(workspaces);
if self.config.run_build_scripts() {