Merge pull request #21644 from Veykril/push-zrzoswxlqlqq

Revert "fix: Stale diagnostics with rust-project.json and rustc JSON"
This commit is contained in:
Lukas Wirth 2026-02-13 18:28:52 +00:00 committed by GitHub
commit bbc84d335f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -741,63 +741,42 @@ impl FlycheckActor {
flycheck_id = self.id,
message = diagnostic.message,
package_id = package_id.as_ref().map(|it| it.as_str()),
scope = ?self.scope,
"diagnostic received"
);
match &self.scope {
FlycheckScope::Workspace => {
if self.diagnostics_received == DiagnosticsReceived::NotYet {
self.send(FlycheckMessage::ClearDiagnostics {
id: self.id,
kind: ClearDiagnosticsKind::All(ClearScope::Workspace),
});
self.diagnostics_received =
DiagnosticsReceived::AtLeastOneAndClearedWorkspace;
}
self.send(FlycheckMessage::AddDiagnostic {
id: self.id,
generation: self.generation,
package_id: None,
workspace_root: self.root.clone(),
diagnostic,
});
}
FlycheckScope::Package { package: flycheck_package, .. } => {
if self.diagnostics_received == DiagnosticsReceived::NotYet {
self.diagnostics_received = DiagnosticsReceived::AtLeastOne;
}
// If the package has been set in the diagnostic JSON, respect that. Otherwise, use the
// package that the current flycheck is scoped to. This is useful when a project is
// directly using rustc for its checks (e.g. custom check commands in rust-project.json).
let package_id = package_id.unwrap_or(flycheck_package.clone());
if self.diagnostics_cleared_for.insert(package_id.clone()) {
tracing::trace!(
flycheck_id = self.id,
package_id = package_id.as_str(),
"clearing diagnostics"
);
self.send(FlycheckMessage::ClearDiagnostics {
id: self.id,
kind: ClearDiagnosticsKind::All(ClearScope::Package(
package_id.clone(),
)),
});
}
self.send(FlycheckMessage::AddDiagnostic {
id: self.id,
generation: self.generation,
package_id: Some(package_id),
workspace_root: self.root.clone(),
diagnostic,
});
}
if self.diagnostics_received == DiagnosticsReceived::NotYet {
self.diagnostics_received = DiagnosticsReceived::AtLeastOne;
}
if let Some(package_id) = &package_id {
if self.diagnostics_cleared_for.insert(package_id.clone()) {
tracing::trace!(
flycheck_id = self.id,
package_id = package_id.as_str(),
"clearing diagnostics"
);
self.send(FlycheckMessage::ClearDiagnostics {
id: self.id,
kind: ClearDiagnosticsKind::All(ClearScope::Package(
package_id.clone(),
)),
});
}
} else if self.diagnostics_received
!= DiagnosticsReceived::AtLeastOneAndClearedWorkspace
{
self.diagnostics_received =
DiagnosticsReceived::AtLeastOneAndClearedWorkspace;
self.send(FlycheckMessage::ClearDiagnostics {
id: self.id,
kind: ClearDiagnosticsKind::All(ClearScope::Workspace),
});
}
self.send(FlycheckMessage::AddDiagnostic {
id: self.id,
generation: self.generation,
package_id,
workspace_root: self.root.clone(),
diagnostic,
});
}
},
}