summaryrefslogtreecommitdiff
path: root/support/texlab/crates/diagnostics/src/manager.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/crates/diagnostics/src/manager.rs')
-rw-r--r--support/texlab/crates/diagnostics/src/manager.rs43
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,
+ }
+ }
}