Unnamed repository; edit this file 'description' to name the repository.
fix: lookup flycheck by ID instead of vector index
After a recent introduction of per-package flycheck for JSON projects, the code assumed that `world.flycheck` indices matched `world.workspaces` indices. However, not all workspaces have flycheck enabled (e.g., JSON projects without a flycheck template configured), so the flycheck vector can be shorter than the workspaces vector. This caused an index-out-of-bounds panic when saving a file in a JSON project without flycheck configured: thread 'Worker' panicked at notification.rs: index out of bounds: the len is 0 but the index is 0 Fix by looking up the flycheck handle by its ID (which is the workspace index set during spawn) rather than using the workspace index directly as a vector index.
lummax 3 months ago
parent adbff8b · commit b912eac
-rw-r--r--crates/rust-analyzer/src/handlers/notification.rs23
1 files changed, 15 insertions, 8 deletions
diff --git a/crates/rust-analyzer/src/handlers/notification.rs b/crates/rust-analyzer/src/handlers/notification.rs
index d956010433..6cc40677fb 100644
--- a/crates/rust-analyzer/src/handlers/notification.rs
+++ b/crates/rust-analyzer/src/handlers/notification.rs
@@ -387,14 +387,21 @@ fn run_flycheck(state: &mut GlobalState, vfs_path: VfsPath) -> bool {
} => false,
});
if let Some(idx) = package_workspace_idx {
- let workspace_deps =
- world.all_workspace_dependencies_for_package(&package);
- world.flycheck[idx].restart_for_package(
- package,
- target,
- workspace_deps,
- saved_file.clone(),
- );
+ // flycheck handles are indexed by their ID (which is the workspace index),
+ // but not all workspaces have flycheck enabled (e.g., JSON projects without
+ // a flycheck template). Find the flycheck handle by its ID.
+ if let Some(flycheck) =
+ world.flycheck.iter().find(|fc| fc.id() == idx)
+ {
+ let workspace_deps =
+ world.all_workspace_dependencies_for_package(&package);
+ flycheck.restart_for_package(
+ package,
+ target,
+ workspace_deps,
+ saved_file.clone(),
+ );
+ }
}
}
}