summaryrefslogtreecommitdiff
path: root/support/texlab/src/diagnostics/chktex.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/diagnostics/chktex.rs')
-rw-r--r--support/texlab/src/diagnostics/chktex.rs103
1 files changed, 0 insertions, 103 deletions
diff --git a/support/texlab/src/diagnostics/chktex.rs b/support/texlab/src/diagnostics/chktex.rs
deleted file mode 100644
index ad676bd70d..0000000000
--- a/support/texlab/src/diagnostics/chktex.rs
+++ /dev/null
@@ -1,103 +0,0 @@
-use std::{
- fs, io,
- path::Path,
- process::{Command, Stdio},
- sync::Arc,
-};
-
-use dashmap::DashMap;
-use lsp_types::{DiagnosticSeverity, Range, Url};
-use once_cell::sync::Lazy;
-use regex::Regex;
-use tempfile::tempdir;
-
-use crate::{RangeExt, Workspace};
-
-use super::{Diagnostic, DiagnosticCode};
-
-pub fn collect_chktex_diagnostics(
- all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>,
- workspace: &Workspace,
- uri: &Url,
-) -> Option<()> {
- let document = workspace.documents_by_uri.get(uri)?;
- document.data.as_latex()?;
-
- all_diagnostics.alter(uri, |_, mut diagnostics| {
- diagnostics.retain(|diag| !matches!(diag.code, DiagnosticCode::Chktex(_)));
- diagnostics
- });
-
- let current_dir = workspace
- .environment
- .options
- .root_directory
- .as_ref()
- .cloned()
- .or_else(|| {
- if document.uri.scheme() == "file" {
- document
- .uri
- .to_file_path()
- .unwrap()
- .parent()
- .map(ToOwned::to_owned)
- } else {
- None
- }
- })
- .unwrap_or_else(|| ".".into());
-
- all_diagnostics
- .entry(Arc::clone(&document.uri))
- .or_default()
- .extend(lint(&document.text, &current_dir).unwrap_or_default());
-
- Some(())
-}
-
-static LINE_REGEX: Lazy<Regex> =
- Lazy::new(|| Regex::new("(\\d+):(\\d+):(\\d+):(\\w+):(\\w+):(.*)").unwrap());
-
-fn lint(text: &str, current_dir: &Path) -> io::Result<Vec<Diagnostic>> {
- let directory = tempdir()?;
- fs::write(directory.path().join("file.tex"), text)?;
- drop(fs::copy(
- current_dir.join("chktexrc"),
- directory.path().join("chktexrc"),
- ));
-
- let output = Command::new("chktex")
- .args(&["-I0", "-f%l:%c:%d:%k:%n:%m\n", "file.tex"])
- .stdin(Stdio::null())
- .stdout(Stdio::piped())
- .stderr(Stdio::piped())
- .current_dir(directory.path())
- .output()?;
-
- let mut diagnostics = Vec::new();
- for line in String::from_utf8_lossy(&output.stdout).lines() {
- let captures = LINE_REGEX.captures(line).unwrap();
- let line = captures[1].parse::<u32>().unwrap() - 1;
- let character = captures[2].parse::<u32>().unwrap() - 1;
- let digit = captures[3].parse::<u32>().unwrap();
- let kind = &captures[4];
- let code = &captures[5];
- let message = captures[6].into();
- let range = Range::new_simple(line, character, line, character + digit);
- let severity = match kind {
- "Message" => DiagnosticSeverity::INFORMATION,
- "Warning" => DiagnosticSeverity::WARNING,
- _ => DiagnosticSeverity::ERROR,
- };
-
- diagnostics.push(Diagnostic {
- range,
- severity,
- code: DiagnosticCode::Chktex(code.into()),
- message,
- });
- }
-
- Ok(diagnostics)
-}