diff options
Diffstat (limited to 'support/texlab/crates/diagnostics')
-rw-r--r-- | support/texlab/crates/diagnostics/src/build_log.rs | 26 | ||||
-rw-r--r-- | support/texlab/crates/diagnostics/src/citations.rs | 27 | ||||
-rw-r--r-- | support/texlab/crates/diagnostics/src/lib.rs | 18 |
3 files changed, 45 insertions, 26 deletions
diff --git a/support/texlab/crates/diagnostics/src/build_log.rs b/support/texlab/crates/diagnostics/src/build_log.rs index f5770c90fb..525bd982ff 100644 --- a/support/texlab/crates/diagnostics/src/build_log.rs +++ b/support/texlab/crates/diagnostics/src/build_log.rs @@ -25,19 +25,24 @@ impl DiagnosticSource for BuildErrors { fn update(&mut self, workspace: &Workspace, log_document: &Document) { let mut errors: FxHashMap<Url, Vec<Diagnostic>> = FxHashMap::default(); - let Some(data) = log_document.data.as_log() else { return }; + let Some(data) = log_document.data.as_log() else { + return; + }; let parents = workspace.parents(log_document); - let Some(root_document) = parents.iter().next() else { return }; + let Some(root_document) = parents.iter().next() else { + return; + }; - let Some(base_path) = root_document - .path - .as_deref() - .and_then(|path| path.parent()) else { return }; + let Some(base_path) = root_document.path.as_deref().and_then(|path| path.parent()) else { + return; + }; for error in &data.errors { let full_path = base_path.join(&error.relative_path); - let Ok(full_path_uri) = Url::from_file_path(&full_path) else { continue }; + let Ok(full_path_uri) = Url::from_file_path(&full_path) else { + continue; + }; let tex_document = workspace.lookup(&full_path_uri).unwrap_or(root_document); let range = find_range_of_hint(tex_document, error).unwrap_or_else(|| { @@ -74,9 +79,12 @@ impl DiagnosticSource for BuildErrors { self.logs.retain(|uri, _| workspace.lookup(uri).is_some()); for document in workspace.iter() { - let Some(log) = self.logs.get(&document.uri) else { continue }; + let Some(log) = self.logs.get(&document.uri) else { + continue; + }; + for (uri, errors) in &log.errors { - builder.push_many(&uri, errors.iter().map(Cow::Borrowed)); + builder.push_many(uri, errors.iter().map(Cow::Borrowed)); } } } diff --git a/support/texlab/crates/diagnostics/src/citations.rs b/support/texlab/crates/diagnostics/src/citations.rs index e6b4d1022a..1ab7b6db30 100644 --- a/support/texlab/crates/diagnostics/src/citations.rs +++ b/support/texlab/crates/diagnostics/src/citations.rs @@ -3,7 +3,7 @@ use std::borrow::Cow; use base_db::{ semantics::{bib::Entry, tex::Citation}, util::queries::{self, Object}, - BibDocumentData, Document, DocumentData, Project, TexDocumentData, Workspace, + Document, Project, Workspace, }; use rustc_hash::FxHashSet; @@ -12,6 +12,8 @@ use crate::{ DiagnosticBuilder, DiagnosticSource, }; +const MAX_UNUSED_ENTRIES: usize = 1000; + #[derive(Default)] pub struct CitationErrors; @@ -23,12 +25,8 @@ impl DiagnosticSource for CitationErrors { ) { for document in workspace.iter() { let project = workspace.project(document); - - if let DocumentData::Tex(data) = &document.data { - detect_undefined_citations(&project, document, data, builder); - } else if let DocumentData::Bib(data) = &document.data { - detect_unused_entries(&project, document, data, builder); - } + detect_undefined_citations(&project, document, builder); + detect_unused_entries(&project, document, builder); } detect_duplicate_entries(workspace, builder); @@ -38,9 +36,12 @@ impl DiagnosticSource for CitationErrors { fn detect_undefined_citations<'db>( project: &Project<'db>, document: &'db Document, - data: &TexDocumentData, builder: &mut DiagnosticBuilder<'db>, ) { + let Some(data) = document.data.as_tex() else { + return; + }; + let entries: FxHashSet<&str> = Entry::find_all(project) .map(|(_, entry)| entry.name_text()) .collect(); @@ -60,9 +61,17 @@ fn detect_undefined_citations<'db>( fn detect_unused_entries<'db>( project: &Project<'db>, document: &'db Document, - data: &BibDocumentData, builder: &mut DiagnosticBuilder<'db>, ) { + let Some(data) = document.data.as_bib() else { + return; + }; + + // If this is a huge bibliography, then don't bother checking for unused entries. + if data.semantics.entries.len() > MAX_UNUSED_ENTRIES { + return; + } + let citations: FxHashSet<&str> = Citation::find_all(project) .map(|(_, citation)| citation.name_text()) .collect(); diff --git a/support/texlab/crates/diagnostics/src/lib.rs b/support/texlab/crates/diagnostics/src/lib.rs index e55ecb78e6..d0be31a0ba 100644 --- a/support/texlab/crates/diagnostics/src/lib.rs +++ b/support/texlab/crates/diagnostics/src/lib.rs @@ -23,7 +23,7 @@ pub struct DiagnosticBuilder<'db> { impl<'db> DiagnosticBuilder<'db> { pub fn push(&mut self, uri: &'db Url, diagnostic: Cow<'db, Diagnostic>) { - self.inner.entry(&uri).or_default().push(diagnostic); + self.inner.entry(uri).or_default().push(diagnostic); } pub fn push_many( @@ -31,7 +31,7 @@ impl<'db> DiagnosticBuilder<'db> { uri: &'db Url, diagnostics: impl Iterator<Item = Cow<'db, Diagnostic>>, ) { - self.inner.entry(&uri).or_default().extend(diagnostics); + self.inner.entry(uri).or_default().extend(diagnostics); } pub fn iter(&self) -> impl Iterator<Item = (&'db Url, impl Iterator<Item = &Diagnostic>)> { @@ -54,12 +54,14 @@ pub struct DiagnosticManager { impl Default for DiagnosticManager { fn default() -> Self { - let mut sources: Vec<Box<dyn DiagnosticSource>> = Vec::new(); - sources.push(Box::new(TexSyntaxErrors::default())); - sources.push(Box::new(BibSyntaxErrors::default())); - sources.push(Box::new(BuildErrors::default())); - sources.push(Box::new(LabelErrors::default())); - sources.push(Box::new(CitationErrors::default())); + let sources: Vec<Box<dyn DiagnosticSource>> = vec![ + Box::<TexSyntaxErrors>::default(), + Box::<BibSyntaxErrors>::default(), + Box::<BuildErrors>::default(), + Box::<LabelErrors>::default(), + Box::<CitationErrors>::default(), + ]; + Self { sources } } } |