fix: Fix flycheck panicking with "once" invocation strategy

We only ever have one flycheck runner no matter the number of workspaces, so just kick off flycheck for it immediately
This commit is contained in:
Lukas Wirth 2025-01-24 14:23:01 +01:00
parent c78cc2baa9
commit 3ab96c40b3
2 changed files with 26 additions and 10 deletions

View file

@ -88,6 +88,17 @@ pub(crate) enum FlycheckConfig {
}, },
} }
impl FlycheckConfig {
pub(crate) fn invocation_strategy_once(&self) -> bool {
match self {
FlycheckConfig::CargoCommand { .. } => false,
FlycheckConfig::CustomCommand { invocation_strategy, .. } => {
*invocation_strategy == InvocationStrategy::Once
}
}
}
}
impl fmt::Display for FlycheckConfig { impl fmt::Display for FlycheckConfig {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self { match self {

View file

@ -291,9 +291,15 @@ fn run_flycheck(state: &mut GlobalState, vfs_path: VfsPath) -> bool {
let file_id = state.vfs.read().0.file_id(&vfs_path); let file_id = state.vfs.read().0.file_id(&vfs_path);
if let Some(file_id) = file_id { if let Some(file_id) = file_id {
let world = state.snapshot(); let world = state.snapshot();
let invocation_strategy_once = state.config.flycheck(None).invocation_strategy_once();
let may_flycheck_workspace = state.config.flycheck_workspace(None); let may_flycheck_workspace = state.config.flycheck_workspace(None);
let mut updated = false; let mut updated = false;
let task = move || -> std::result::Result<(), ide::Cancelled> { let task = move || -> std::result::Result<(), ide::Cancelled> {
if invocation_strategy_once {
let saved_file = vfs_path.as_path().map(|p| p.to_owned());
world.flycheck[0].restart_workspace(saved_file.clone());
}
let target = TargetSpec::for_file(&world, file_id)?.and_then(|it| { let target = TargetSpec::for_file(&world, file_id)?.and_then(|it| {
let tgt_kind = it.target_kind(); let tgt_kind = it.target_kind();
let (tgt_name, root, package) = match it { let (tgt_name, root, package) = match it {
@ -320,16 +326,15 @@ fn run_flycheck(state: &mut GlobalState, vfs_path: VfsPath) -> bool {
// the user opted into package checks then // the user opted into package checks then
let package_check_allowed = target.is_some() || !may_flycheck_workspace; let package_check_allowed = target.is_some() || !may_flycheck_workspace;
if package_check_allowed { if package_check_allowed {
let workspace = let workspace = world.workspaces.iter().position(|ws| match &ws.kind {
world.workspaces.iter().enumerate().find(|(_, ws)| match &ws.kind { project_model::ProjectWorkspaceKind::Cargo { cargo, .. }
project_model::ProjectWorkspaceKind::Cargo { cargo, .. } | project_model::ProjectWorkspaceKind::DetachedFile {
| project_model::ProjectWorkspaceKind::DetachedFile { cargo: Some((cargo, _, _)),
cargo: Some((cargo, _, _)), ..
.. } => *cargo.workspace_root() == root,
} => *cargo.workspace_root() == root, _ => false,
_ => false, });
}); if let Some(idx) = workspace {
if let Some((idx, _)) = workspace {
world.flycheck[idx].restart_for_package(package, target); world.flycheck[idx].restart_for_package(package, target);
} }
} }