From 55140d5421e1ad0024c9acbfa72bd06402c2aa9f Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Sun, 17 Mar 2024 03:01:42 +0000 Subject: CTAN sync 202403170301 --- support/texlab/crates/diagnostics/Cargo.toml | 4 +- support/texlab/crates/diagnostics/src/citations.rs | 24 ++++++++---- support/texlab/crates/diagnostics/src/labels.rs | 25 +++++++++---- support/texlab/crates/diagnostics/src/manager.rs | 43 +++++++++++++++++++--- support/texlab/crates/diagnostics/src/tests.rs | 2 +- 5 files changed, 74 insertions(+), 24 deletions(-) (limited to 'support/texlab/crates/diagnostics') diff --git a/support/texlab/crates/diagnostics/Cargo.toml b/support/texlab/crates/diagnostics/Cargo.toml index 1fb4b2171d..91c2ff9dbd 100644 --- a/support/texlab/crates/diagnostics/Cargo.toml +++ b/support/texlab/crates/diagnostics/Cargo.toml @@ -14,8 +14,8 @@ encoding_rs = "0.8.33" encoding_rs_io = "0.1.7" itertools = "0.12.0" line-index = { path = "../line-index" } -log = "0.4.20" -multimap = "0.9.1" +log = "0.4.21" +multimap = "0.10.0" once_cell = "1.19.0" parking_lot = "0.12.1" regex = "1.10.2" diff --git a/support/texlab/crates/diagnostics/src/citations.rs b/support/texlab/crates/diagnostics/src/citations.rs index 403d2f5bfc..ea4ef03d58 100644 --- a/support/texlab/crates/diagnostics/src/citations.rs +++ b/support/texlab/crates/diagnostics/src/citations.rs @@ -3,8 +3,7 @@ use base_db::{ util::queries::{self, Object}, Document, Project, Workspace, }; -use multimap::MultiMap; -use rustc_hash::FxHashSet; +use rustc_hash::{FxHashMap, FxHashSet}; use url::Url; use crate::types::{BibError, Diagnostic, TexError}; @@ -14,7 +13,7 @@ const MAX_UNUSED_ENTRIES: usize = 1000; pub fn detect_undefined_citations<'a>( project: &Project<'a>, document: &'a Document, - results: &mut MultiMap, + results: &mut FxHashMap>, ) -> Option<()> { let data = document.data.as_tex()?; @@ -26,7 +25,10 @@ pub fn detect_undefined_citations<'a>( let name = citation.name_text(); if name != "*" && !entries.contains(name) { let diagnostic = Diagnostic::Tex(citation.name.range, TexError::UndefinedCitation); - results.insert(document.uri.clone(), diagnostic); + results + .entry(document.uri.clone()) + .or_default() + .push(diagnostic); } } @@ -36,7 +38,7 @@ pub fn detect_undefined_citations<'a>( pub fn detect_unused_entries<'a>( project: &Project<'a>, document: &'a Document, - results: &mut MultiMap, + results: &mut FxHashMap>, ) -> Option<()> { let data = document.data.as_bib()?; @@ -52,7 +54,10 @@ pub fn detect_unused_entries<'a>( for entry in &data.semantics.entries { if !citations.contains(entry.name.text.as_str()) { let diagnostic = Diagnostic::Bib(entry.name.range, BibError::UnusedEntry); - results.insert(document.uri.clone(), diagnostic); + results + .entry(document.uri.clone()) + .or_default() + .push(diagnostic); } } @@ -61,7 +66,7 @@ pub fn detect_unused_entries<'a>( pub fn detect_duplicate_entries<'a>( workspace: &'a Workspace, - results: &mut MultiMap, + results: &mut FxHashMap>, ) { for conflict in queries::Conflict::find_all::(workspace) { let others = conflict @@ -71,6 +76,9 @@ pub fn detect_duplicate_entries<'a>( .collect(); let diagnostic = Diagnostic::Bib(conflict.main.range, BibError::DuplicateEntry(others)); - results.insert(conflict.main.document.uri.clone(), diagnostic); + results + .entry(conflict.main.document.uri.clone()) + .or_default() + .push(diagnostic); } } diff --git a/support/texlab/crates/diagnostics/src/labels.rs b/support/texlab/crates/diagnostics/src/labels.rs index 92f9072918..9a39f3f24b 100644 --- a/support/texlab/crates/diagnostics/src/labels.rs +++ b/support/texlab/crates/diagnostics/src/labels.rs @@ -4,15 +4,14 @@ use base_db::{ DocumentData, Workspace, }; use itertools::Itertools; -use multimap::MultiMap; -use rustc_hash::FxHashSet; +use rustc_hash::{FxHashMap, FxHashSet}; use url::Url; use crate::types::{Diagnostic, TexError}; pub fn detect_undefined_and_unused_labels( workspace: &Workspace, - results: &mut MultiMap, + results: &mut FxHashMap>, ) { let graphs: Vec<_> = workspace .iter() @@ -45,18 +44,27 @@ pub fn detect_undefined_and_unused_labels( for label in &data.semantics.labels { if label.kind != LabelKind::Definition && !label_defs.contains(&label.name.text) { let diagnostic = Diagnostic::Tex(label.name.range, TexError::UndefinedLabel); - results.insert(document.uri.clone(), diagnostic); + results + .entry(document.uri.clone()) + .or_default() + .push(diagnostic); } if label.kind == LabelKind::Definition && !label_refs.contains(&label.name.text) { let diagnostic = Diagnostic::Tex(label.name.range, TexError::UnusedLabel); - results.insert(document.uri.clone(), diagnostic); + results + .entry(document.uri.clone()) + .or_default() + .push(diagnostic); } } } } -pub fn detect_duplicate_labels(workspace: &Workspace, results: &mut MultiMap) { +pub fn detect_duplicate_labels( + workspace: &Workspace, + results: &mut FxHashMap>, +) { for conflict in queries::Conflict::find_all::