summaryrefslogtreecommitdiff
path: root/support/texlab/src/diagnostics/bibtex.rs
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2022-07-04 03:03:43 +0000
committerNorbert Preining <norbert@preining.info>2022-07-04 03:03:43 +0000
commit1c10375ec46d7d83b2f1efc2a71b7ea114c889f0 (patch)
tree47b3469111105b7767111dcb89858fbc1e73377f /support/texlab/src/diagnostics/bibtex.rs
parent34d318af65decbdb242ae03b64bf3f53266067b6 (diff)
CTAN sync 202207040303
Diffstat (limited to 'support/texlab/src/diagnostics/bibtex.rs')
-rw-r--r--support/texlab/src/diagnostics/bibtex.rs147
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(());
}