9801: fix: Don't publish diagnostics in crates.io or sysroot files r=jonas-schievink a=jonas-schievink

Fixes https://github.com/rust-analyzer/rust-analyzer/issues/9766

bors r+

Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
This commit is contained in:
bors[bot] 2021-08-06 14:16:24 +00:00 committed by GitHub
commit b8800fd85d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -9,7 +9,7 @@ use std::{
use always_assert::always; use always_assert::always;
use crossbeam_channel::{select, Receiver}; use crossbeam_channel::{select, Receiver};
use ide::{FileId, PrimeCachesProgress}; use ide::{FileId, PrimeCachesProgress};
use ide_db::base_db::VfsPath; use ide_db::base_db::{SourceDatabaseExt, VfsPath};
use lsp_server::{Connection, Notification, Request}; use lsp_server::{Connection, Notification, Request};
use lsp_types::notification::Notification as _; use lsp_types::notification::Notification as _;
use vfs::ChangeKind; use vfs::ChangeKind;
@ -454,6 +454,17 @@ impl GlobalState {
if let Some(diagnostic_changes) = self.diagnostics.take_changes() { if let Some(diagnostic_changes) = self.diagnostics.take_changes() {
for file_id in diagnostic_changes { for file_id in diagnostic_changes {
let db = self.analysis_host.raw_database();
let source_root = db.file_source_root(file_id);
if db.source_root(source_root).is_library {
// Only publish diagnostics for files in the workspace, not from crates.io deps
// or the sysroot.
// While theoretically these should never have errors, we have quite a few false
// positives particularly in the stdlib, and those diagnostics would stay around
// forever if we emitted them here.
continue;
}
let url = file_id_to_url(&self.vfs.read().0, file_id); let url = file_id_to_url(&self.vfs.read().0, file_id);
let diagnostics = self.diagnostics.diagnostics_for(file_id).cloned().collect(); let diagnostics = self.diagnostics.diagnostics_for(file_id).cloned().collect();
let version = from_proto::vfs_path(&url) let version = from_proto::vfs_path(&url)