texlab 4.1.0

LaTeX Language Server
Documentation
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<Arc<Url>, MultiMap<Arc<Url>, Diagnostic>>,
    chktex_diagnostics: MultiMap<Arc<Url>, Diagnostic>,
}

impl DiagnosticsManager {
    pub fn update_static(&mut self, workspace: &Workspace, uri: Arc<Url>) {
        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<Diagnostic> {
        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
    }
}