diff options
Diffstat (limited to 'support/texlab/crates/diagnostics/src/manager.rs')
-rw-r--r-- | support/texlab/crates/diagnostics/src/manager.rs | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/support/texlab/crates/diagnostics/src/manager.rs b/support/texlab/crates/diagnostics/src/manager.rs index 1ce5e194b8..38c0a514f4 100644 --- a/support/texlab/crates/diagnostics/src/manager.rs +++ b/support/texlab/crates/diagnostics/src/manager.rs @@ -16,6 +16,10 @@ pub struct Manager { impl Manager { /// Updates the syntax-based diagnostics for the given document. pub fn update_syntax(&mut self, workspace: &Workspace, document: &Document) { + if !Self::is_relevant(document) { + return; + } + self.grammar.remove(&document.uri); super::grammar::tex::update(document, workspace.config(), &mut self.grammar); super::grammar::bib::update(document, &mut self.grammar); @@ -30,14 +34,20 @@ impl Manager { } /// Returns all filtered diagnostics for the given workspace. - pub fn get(&self, workspace: &Workspace) -> MultiMap<Url, Diagnostic> { - let mut results = MultiMap::default(); + pub fn get(&self, workspace: &Workspace) -> FxHashMap<Url, Vec<Diagnostic>> { + let mut results: FxHashMap<Url, Vec<Diagnostic>> = FxHashMap::default(); for (uri, diagnostics) in &self.grammar { - results.insert_many_from_slice(uri.clone(), diagnostics); + results + .entry(uri.clone()) + .or_default() + .extend(diagnostics.iter().cloned()); } for (uri, diagnostics) in self.build_log.values().flatten() { - results.insert_many_from_slice(uri.clone(), diagnostics); + results + .entry(uri.clone()) + .or_default() + .extend(diagnostics.iter().cloned()); } for (uri, diagnostics) in &self.chktex { @@ -45,11 +55,17 @@ impl Manager { .lookup(uri) .map_or(false, |document| document.owner == Owner::Client) { - results.insert_many_from_slice(uri.clone(), diagnostics); + results + .entry(uri.clone()) + .or_default() + .extend(diagnostics.iter().cloned()); } } - for document in workspace.iter() { + for document in workspace + .iter() + .filter(|document| Self::is_relevant(document)) + { let project = workspace.project(document); super::citations::detect_undefined_citations(&project, document, &mut results); super::citations::detect_unused_entries(&project, document, &mut results); @@ -60,6 +76,13 @@ impl Manager { super::labels::detect_undefined_and_unused_labels(workspace, &mut results); let config = &workspace.config().diagnostics; + + results.retain(|uri, _| { + workspace + .lookup(uri) + .map_or(false, |document| Self::is_relevant(document)) + }); + for (_, diagnostics) in &mut results { diagnostics.retain(|diagnostic| { filter_regex_patterns( @@ -72,4 +95,12 @@ impl Manager { results } + + fn is_relevant(document: &Document) -> bool { + match document.owner { + Owner::Client => true, + Owner::Server => true, + Owner::Distro => false, + } + } } |