mod bibtex; mod build_log; mod chktex; mod debouncer; mod latex; use std::sync::Arc; use lsp_types::{Diagnostic, Url}; use multimap::MultiMap; use rustc_hash::FxHashMap; use crate::{Options, Workspace}; pub use self::debouncer::{DiagnosticsDebouncer, DiagnosticsMessage}; use self::{ bibtex::analyze_bibtex_static, build_log::analyze_build_log_static, chktex::analyze_latex_chktex, latex::analyze_latex_static, }; #[derive(Default)] pub struct DiagnosticsManager { static_diagnostics: FxHashMap, MultiMap, Diagnostic>>, chktex_diagnostics: MultiMap, Diagnostic>, } impl DiagnosticsManager { pub fn update_static(&mut self, workspace: &Workspace, uri: Arc) { let mut diagnostics_by_uri = MultiMap::new(); analyze_build_log_static(workspace, &mut diagnostics_by_uri, &uri); analyze_bibtex_static(workspace, &mut diagnostics_by_uri, &uri); analyze_latex_static(workspace, &mut diagnostics_by_uri, &uri); self.static_diagnostics.insert(uri, diagnostics_by_uri); } pub fn update_chktex(&mut self, workspace: &Workspace, uri: &Url, options: &Options) { analyze_latex_chktex(workspace, &mut self.chktex_diagnostics, uri, options); } #[must_use] pub fn publish(&self, uri: &Url) -> Vec { let mut all_diagnostics = Vec::new(); for diagnostics_by_uri in self.static_diagnostics.values() { if let Some(diagnostics) = diagnostics_by_uri.get_vec(uri) { all_diagnostics.append(&mut diagnostics.clone()); } } if let Some(diagnostics) = self.chktex_diagnostics.get_vec(uri) { all_diagnostics.append(&mut diagnostics.clone()); } all_diagnostics } }