summaryrefslogtreecommitdiff
path: root/support/texlab/crates/diagnostics
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-08-13 03:03:49 +0000
committerNorbert Preining <norbert@preining.info>2023-08-13 03:03:49 +0000
commit03f1daec22e3e5e2ae8d117d503ee9648c5b3f91 (patch)
tree1d0fde49b1a45b2263d5688a2e82cec643aea65b /support/texlab/crates/diagnostics
parent1671b301fbe6cef52ccfa6085824e9677703e023 (diff)
CTAN sync 202308130303
Diffstat (limited to 'support/texlab/crates/diagnostics')
-rw-r--r--support/texlab/crates/diagnostics/src/build_log.rs26
-rw-r--r--support/texlab/crates/diagnostics/src/citations.rs27
-rw-r--r--support/texlab/crates/diagnostics/src/lib.rs18
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 }
}
}