diff options
author | Norbert Preining <norbert@preining.info> | 2022-07-04 03:03:43 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2022-07-04 03:03:43 +0000 |
commit | 1c10375ec46d7d83b2f1efc2a71b7ea114c889f0 (patch) | |
tree | 47b3469111105b7767111dcb89858fbc1e73377f /support/texlab/src/diagnostics/bibtex.rs | |
parent | 34d318af65decbdb242ae03b64bf3f53266067b6 (diff) |
CTAN sync 202207040303
Diffstat (limited to 'support/texlab/src/diagnostics/bibtex.rs')
-rw-r--r-- | support/texlab/src/diagnostics/bibtex.rs | 147 |
1 files changed, 71 insertions, 76 deletions
diff --git a/support/texlab/src/diagnostics/bibtex.rs b/support/texlab/src/diagnostics/bibtex.rs index 1beec52c5c..42e215a794 100644 --- a/support/texlab/src/diagnostics/bibtex.rs +++ b/support/texlab/src/diagnostics/bibtex.rs @@ -1,7 +1,7 @@ use std::sync::Arc; -use lsp_types::{Diagnostic, DiagnosticSeverity, NumberOrString, Url}; -use multimap::MultiMap; +use dashmap::DashMap; +use lsp_types::{DiagnosticSeverity, Url}; use rowan::{ast::AstNode, TextRange}; use crate::{ @@ -9,85 +9,84 @@ use crate::{ Document, LineIndexExt, Workspace, }; -pub fn analyze_bibtex_static( +use super::{BibtexCode, Diagnostic, DiagnosticCode}; + +pub fn collect_bibtex_diagnostics( + all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, workspace: &Workspace, - diagnostics_by_uri: &mut MultiMap<Arc<Url>, Diagnostic>, uri: &Url, ) -> Option<()> { let document = workspace.documents_by_uri.get(uri)?; let data = document.data.as_bibtex()?; - for node in bibtex::SyntaxNode::new_root(data.green.clone()).descendants() { - analyze_entry(document, diagnostics_by_uri, node.clone()) - .or_else(|| analyze_field(document, diagnostics_by_uri, node)); + all_diagnostics.alter(uri, |_, mut diagnostics| { + diagnostics.retain(|diag| !matches!(diag.code, DiagnosticCode::Bibtex(_))); + diagnostics + }); + + let root = bibtex::SyntaxNode::new_root(data.green.clone()); + for node in root.descendants() { + analyze_entry(all_diagnostics, document, node.clone()) + .or_else(|| analyze_field(all_diagnostics, document, node)); } Some(()) } fn analyze_entry( + all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, document: &Document, - diagnostics_by_uri: &mut MultiMap<Arc<Url>, Diagnostic>, node: bibtex::SyntaxNode, ) -> Option<()> { let entry = bibtex::Entry::cast(node)?; if entry.left_delim_token().is_none() { - diagnostics_by_uri.insert( - Arc::clone(&document.uri), - Diagnostic { + let code = BibtexCode::ExpectingLCurly; + all_diagnostics + .entry(Arc::clone(&document.uri)) + .or_default() + .push(Diagnostic { + severity: DiagnosticSeverity::ERROR, range: document .line_index .line_col_lsp_range(entry.type_token()?.text_range()), - severity: Some(DiagnosticSeverity::ERROR), - code: Some(NumberOrString::Number(4)), - code_description: None, - source: Some("texlab".to_string()), - message: "Expecting a curly bracket: \"{\"".to_string(), - related_information: None, - tags: None, - data: None, - }, - ); + code: DiagnosticCode::Bibtex(code), + message: String::from(code), + }); + return Some(()); } if entry.name_token().is_none() { - diagnostics_by_uri.insert( - Arc::clone(&document.uri), - Diagnostic { + let code = BibtexCode::ExpectingKey; + all_diagnostics + .entry(Arc::clone(&document.uri)) + .or_default() + .push(Diagnostic { + severity: DiagnosticSeverity::ERROR, range: document .line_index .line_col_lsp_range(entry.left_delim_token()?.text_range()), - severity: Some(DiagnosticSeverity::ERROR), - code: Some(NumberOrString::Number(5)), - code_description: None, - source: Some("texlab".to_string()), - message: "Expecting a key".to_string(), - related_information: None, - tags: None, - data: None, - }, - ); + code: DiagnosticCode::Bibtex(code), + message: String::from(code), + }); + return Some(()); } if entry.right_delim_token().is_none() { - diagnostics_by_uri.insert( - Arc::clone(&document.uri), - Diagnostic { + let code = BibtexCode::ExpectingRCurly; + all_diagnostics + .entry(Arc::clone(&document.uri)) + .or_default() + .push(Diagnostic { + severity: DiagnosticSeverity::ERROR, range: document .line_index .line_col_lsp_range(TextRange::empty(entry.syntax().text_range().end())), - severity: Some(DiagnosticSeverity::ERROR), - code: Some(NumberOrString::Number(6)), - code_description: None, - source: Some("texlab".to_string()), - message: "Expecting a curly bracket: \"}\"".to_string(), - related_information: None, - tags: None, - data: None, - }, - ); + code: DiagnosticCode::Bibtex(code), + message: String::from(code), + }); + return Some(()); } @@ -95,48 +94,44 @@ fn analyze_entry( } fn analyze_field( + all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, document: &Document, - diagnostics_by_uri: &mut MultiMap<Arc<Url>, Diagnostic>, node: bibtex::SyntaxNode, ) -> Option<()> { let field = bibtex::Field::cast(node)?; if field.eq_token().is_none() { - diagnostics_by_uri.insert( - Arc::clone(&document.uri), - Diagnostic { + let code = BibtexCode::ExpectingEq; + all_diagnostics + .entry(Arc::clone(&document.uri)) + .or_default() + .push(Diagnostic { + severity: DiagnosticSeverity::ERROR, range: document .line_index - .line_col_lsp_range(TextRange::empty(field.name_token()?.text_range().end())), - severity: Some(DiagnosticSeverity::ERROR), - code: Some(NumberOrString::Number(7)), - code_description: None, - source: Some("texlab".to_string()), - message: "Expecting an equality sign: \"=\"".to_string(), - related_information: None, - tags: None, - data: None, - }, - ); + .line_col_lsp_range(field.name_token()?.text_range()), + + code: DiagnosticCode::Bibtex(code), + message: String::from(code), + }); + return Some(()); } if field.value().is_none() { - diagnostics_by_uri.insert( - Arc::clone(&document.uri), - Diagnostic { + let code = BibtexCode::ExpectingFieldValue; + all_diagnostics + .entry(Arc::clone(&document.uri)) + .or_default() + .push(Diagnostic { + severity: DiagnosticSeverity::ERROR, range: document .line_index - .line_col_lsp_range(TextRange::empty(field.eq_token()?.text_range().end())), - severity: Some(DiagnosticSeverity::ERROR), - code: Some(NumberOrString::Number(8)), - code_description: None, - source: Some("texlab".to_string()), - message: "Expecting a field value".to_string(), - related_information: None, - tags: None, - data: None, - }, - ); + .line_col_lsp_range(field.name_token()?.text_range()), + + code: DiagnosticCode::Bibtex(code), + message: String::from(code), + }); + return Some(()); } |