diff options
author | Norbert Preining <norbert@preining.info> | 2023-01-22 03:01:36 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2023-01-22 03:01:36 +0000 |
commit | 328cc6eb536476a95a84cd7de863b32cabc41b0e (patch) | |
tree | 6ce563a6c5075adedee625e648ab6e1fd86a0052 /support/texlab/src | |
parent | 94c0d48361932b4beca57cc5609d26a46270dfeb (diff) |
CTAN sync 202301220301
Diffstat (limited to 'support/texlab/src')
17 files changed, 171 insertions, 81 deletions
diff --git a/support/texlab/src/db/diagnostics.rs b/support/texlab/src/db/diagnostics.rs index 9b6691b873..81ed24fd2e 100644 --- a/support/texlab/src/db/diagnostics.rs +++ b/support/texlab/src/db/diagnostics.rs @@ -116,6 +116,7 @@ pub fn collect(db: &dyn Db, workspace: Workspace) -> FxHashMap<Document, Vec<Dia .extend(diagnostics.clone()); }); } + Language::TexlabRoot | Language::Tectonic => {} } } diff --git a/support/texlab/src/db/discovery.rs b/support/texlab/src/db/discovery.rs index 0e1ec314f7..5986fcd888 100644 --- a/support/texlab/src/db/discovery.rs +++ b/support/texlab/src/db/discovery.rs @@ -226,12 +226,16 @@ fn discover_parents(db: &mut dyn Db, workspace: Workspace) -> bool { .flatten() .filter(|entry| entry.file_type().map_or(false, |ty| ty.is_file())) .map(|entry| entry.path()) - .filter(|path| Language::from_path(&path) == Some(Language::Tex)) { - if workspace.lookup_path(db, &path).is_none() { - changed |= workspace - .load(db, &path, Language::Tex, Owner::Server) - .is_some(); + if let Some(language) = Language::from_path(&path) { + let can_be_parent = matches!( + language, + Language::Tex | Language::TexlabRoot | Language::Tectonic + ); + + if can_be_parent && workspace.lookup_path(db, &path).is_none() { + changed |= workspace.load(db, &path, language, Owner::Server).is_some(); + } } } diff --git a/support/texlab/src/db/document.rs b/support/texlab/src/db/document.rs index 186bd06ab3..4ee23a2230 100644 --- a/support/texlab/src/db/document.rs +++ b/support/texlab/src/db/document.rs @@ -1,7 +1,4 @@ -use std::{ - ffi::OsStr, - path::{Path, PathBuf}, -}; +use std::path::{Path, PathBuf}; use lsp_types::Url; use rowan::{TextRange, TextSize}; @@ -9,7 +6,7 @@ use rowan::{TextRange, TextSize}; use crate::{ db::{ diagnostics::Diagnostic, - parse::{BibDocumentData, LogDocumentData, TexDocumentData}, + parse::{BibDocumentData, LogDocumentData, TectonicData, TexDocumentData, TexlabRootData}, }, parser::{parse_bibtex, parse_build_log, parse_latex}, util::line_index::LineIndex, @@ -49,14 +46,6 @@ impl Location { let uri = self.uri(db).join(path).ok()?; Some(Location::new(db, uri)) } - - pub fn into_dir(self, db: &dyn Db) -> Location { - if self.uri(db).path().ends_with("/") { - self.join(db, ".").unwrap() - } else { - self - } - } } #[salsa::input] @@ -84,17 +73,23 @@ pub enum Language { Tex, Bib, Log, + TexlabRoot, + Tectonic, } impl Language { pub fn from_path(path: &Path) -> Option<Self> { - path.extension() - .and_then(OsStr::to_str) - .and_then(Self::from_extension) - } + let name = path.file_name()?; + if name.eq_ignore_ascii_case(".texlabroot") || name.eq_ignore_ascii_case("texlabroot") { + return Some(Self::TexlabRoot); + } + + if name.eq_ignore_ascii_case("Tectonic.toml") { + return Some(Self::Tectonic); + } - pub fn from_extension(extension: &str) -> Option<Self> { - match extension.to_lowercase().as_str() { + let extname = path.extension()?.to_str()?; + match extname.to_lowercase().as_str() { "tex" | "sty" | "cls" | "def" | "lco" | "aux" | "rnw" => Some(Self::Tex), "bib" | "bibtex" => Some(Self::Bib), "log" => Some(Self::Log), @@ -106,6 +101,7 @@ impl Language { match id { "tex" | "latex" => Some(Self::Tex), "bib" | "bibtex" => Some(Self::Bib), + "texlabroot" => Some(Self::TexlabRoot), _ => None, } } @@ -136,7 +132,7 @@ impl Document { } pub fn directory(self, db: &dyn Db) -> Location { - self.location(db).into_dir(db) + self.location(db).join(db, ".").unwrap() } pub fn ancestor_dirs<'db>(self, db: &'db dyn Db) -> impl Iterator<Item = &'db Path> + 'db { @@ -167,6 +163,14 @@ impl Document { let data = LogDocumentData::new(db, parse_build_log(text)); DocumentData::Log(data) } + Language::TexlabRoot => { + let data = TexlabRootData; + DocumentData::TexlabRoot(data) + } + Language::Tectonic => { + let data = TectonicData; + DocumentData::Tectonic(data) + } } } diff --git a/support/texlab/src/db/parse.rs b/support/texlab/src/db/parse.rs index d532c536a3..7187135d52 100644 --- a/support/texlab/src/db/parse.rs +++ b/support/texlab/src/db/parse.rs @@ -41,10 +41,18 @@ pub struct LogDocumentData { } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +pub struct TexlabRootData; + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +pub struct TectonicData; + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] pub enum DocumentData { Tex(TexDocumentData), Bib(BibDocumentData), Log(LogDocumentData), + TexlabRoot(TexlabRootData), + Tectonic(TectonicData), } impl DocumentData { diff --git a/support/texlab/src/db/workspace.rs b/support/texlab/src/db/workspace.rs index b8bdb27f1f..0fb9745b12 100644 --- a/support/texlab/src/db/workspace.rs +++ b/support/texlab/src/db/workspace.rs @@ -11,7 +11,6 @@ use rustc_hash::FxHashSet; use crate::{ db::document::{Document, Location}, distro::FileNameDB, - util::HOME_DIR, Db, Options, }; @@ -154,49 +153,31 @@ impl Workspace { } } -const SPECIAL_ENTRIES: &[&str] = &[ - ".git", - "Tectonic.toml", - ".latexmkrc", - "latexmkrc", - ".chktexrc", - "chktexrc", -]; - #[salsa::tracked] impl Workspace { #[salsa::tracked] pub fn working_dir(self, db: &dyn Db, base_dir: Location) -> Location { - let mut path = self + if let Some(dir) = self .options(db) .root_directory .as_deref() .and_then(|path| path.to_str()) - .or_else(|| { - for dir in base_dir - .path(db) - .as_deref()? - .ancestors() - .skip(1) - .filter(|path| Some(*path) != HOME_DIR.as_deref()) - { - for name in SPECIAL_ENTRIES { - if dir.join(name).exists() { - return Some(dir.to_str()?); - } - } - } - - None - }) - .unwrap_or(".") - .to_string(); - - if !path.ends_with(".") { - path.push('/'); + .and_then(|path| base_dir.join(db, path)) + { + return dir; } - base_dir.join(db, &path).unwrap_or(base_dir) + self.documents(db) + .iter() + .filter(|doc| matches!(doc.language(db), Language::TexlabRoot | Language::Tectonic)) + .filter_map(|doc| doc.location(db).join(db, ".")) + .find(|root_dir| { + base_dir + .uri(db) + .as_str() + .starts_with(root_dir.uri(db).as_str()) + }) + .unwrap_or(base_dir) } #[salsa::tracked] diff --git a/support/texlab/src/features/build.rs b/support/texlab/src/features/build.rs index 645f1e8e0e..69c3a7825c 100644 --- a/support/texlab/src/features/build.rs +++ b/support/texlab/src/features/build.rs @@ -104,12 +104,17 @@ impl Command { .stdin(Stdio::null()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) - .current_dir(self.working_dir) + .current_dir(&self.working_dir) .spawn() { Ok(process) => process, - Err(_) => { - log::error!("Failed to spawn process: {:?}", self.executable); + Err(why) => { + log::error!( + "Failed to spawn process {:?} in directory {}: {}", + self.executable, + self.working_dir.display(), + why + ); return BuildStatus::FAILURE; } }; @@ -127,7 +132,7 @@ impl Command { .recv(&line_receiver, |line| match line { Ok(message) => { let params = LogMessageParams { message, typ }; - client.send_notification::<LogMessage>(params).unwrap(); + let _ = client.send_notification::<LogMessage>(params); false } Err(_) => true, @@ -170,9 +175,10 @@ fn track_output( ); thread::spawn(move || { - for line in reader.lines() { - sender.send(line.unwrap()).unwrap(); - } + let _ = reader + .lines() + .flatten() + .try_for_each(|line| sender.send(line)); }) } diff --git a/support/texlab/src/features/folding.rs b/support/texlab/src/features/folding.rs index ea26121f3f..153b839f57 100644 --- a/support/texlab/src/features/folding.rs +++ b/support/texlab/src/features/folding.rs @@ -43,7 +43,9 @@ pub fn find_all(db: &dyn Db, uri: &Url) -> Option<Vec<FoldingRange>> { .map(|node| create_range(line_index.line_col_lsp_range(node.text_range()))) .collect() } - DocumentData::Log(_) => return None, + DocumentData::Log(_) | DocumentData::TexlabRoot(_) | DocumentData::Tectonic(_) => { + return None; + } }; Some(foldings) diff --git a/support/texlab/src/features/formatting.rs b/support/texlab/src/features/formatting.rs index 66375bd576..09737777fd 100644 --- a/support/texlab/src/features/formatting.rs +++ b/support/texlab/src/features/formatting.rs @@ -26,6 +26,6 @@ pub fn format_source_code( BibtexFormatter::Texlab => format_bibtex_internal(db, document, options), BibtexFormatter::Latexindent => format_with_latexindent(db, document), }, - Language::Log => None, + Language::Log | Language::TexlabRoot | Language::Tectonic => None, } } diff --git a/support/texlab/src/features/reference/entry.rs b/support/texlab/src/features/reference/entry.rs index 3dfa10da5b..0c8f374cb7 100644 --- a/support/texlab/src/features/reference/entry.rs +++ b/support/texlab/src/features/reference/entry.rs @@ -47,7 +47,10 @@ pub(super) fn find_all_references( results.push(ReferenceResult { document, range }); }); } - DocumentData::Bib(_) | DocumentData::Log(_) => {} + DocumentData::Bib(_) + | DocumentData::Log(_) + | DocumentData::TexlabRoot(_) + | DocumentData::Tectonic(_) => {} }; } diff --git a/support/texlab/src/features/rename/entry.rs b/support/texlab/src/features/rename/entry.rs index 79ee25ac71..67c0388f4f 100644 --- a/support/texlab/src/features/rename/entry.rs +++ b/support/texlab/src/features/rename/entry.rs @@ -58,7 +58,7 @@ pub(super) fn rename(context: &CursorContext<Params>) -> Option<RenameResult> { .collect(); changes.insert(document, edits); } - DocumentData::Log(_) => {} + DocumentData::Log(_) | DocumentData::TexlabRoot(_) | DocumentData::Tectonic(_) => {} } } diff --git a/support/texlab/src/server.rs b/support/texlab/src/server.rs index 93b35c69c6..fe6f75e74a 100644 --- a/support/texlab/src/server.rs +++ b/support/texlab/src/server.rs @@ -678,9 +678,7 @@ impl Server { let client = self.client.clone(); self.build_internal(uri, move |status| { let result = BuildResult { status }; - client - .send_response(lsp_server::Response::new_ok(id, result)) - .unwrap(); + let _ = client.send_response(lsp_server::Response::new_ok(id, result)); })?; Ok(()) @@ -710,7 +708,7 @@ impl Server { let status = compiler.run(); if forward_search_after { - sender.send(InternalMessage::ForwardSearch(uri)).unwrap(); + let _ = sender.send(InternalMessage::ForwardSearch(uri)); } drop(guard); @@ -727,9 +725,7 @@ impl Server { let client = self.client.clone(); self.forward_search_internal(uri, Some(params.position), move |status| { let result = ForwardSearchResult { status }; - client - .send_response(lsp_server::Response::new_ok(id, result)) - .unwrap(); + let _ = client.send_response(lsp_server::Response::new_ok(id, result)); })?; Ok(()) diff --git a/support/texlab/src/tests/fixture.rs b/support/texlab/src/tests/fixture.rs index b837a9f5b0..fb2a6e6d69 100644 --- a/support/texlab/src/tests/fixture.rs +++ b/support/texlab/src/tests/fixture.rs @@ -15,7 +15,9 @@ enum Line<'a> { } fn parse_line(line: &str) -> Line { - if let Some(name) = line.strip_prefix("%TEX ") { + if let Some(name) = line.strip_prefix("%ROOT ") { + Line::File(name, "texlabroot") + } else if let Some(name) = line.strip_prefix("%TEX ") { Line::File(name, "latex") } else if let Some(name) = line.strip_prefix("%BIB ") { Line::File(name, "bibtex") diff --git a/support/texlab/src/tests/snapshots/texlab__tests__issues__issue_707.snap b/support/texlab/src/tests/snapshots/texlab__tests__issues__issue_707.snap index 1397a08fc0..38e15f8103 100644 --- a/support/texlab/src/tests/snapshots/texlab__tests__issues__issue_707.snap +++ b/support/texlab/src/tests/snapshots/texlab__tests__issues__issue_707.snap @@ -1,6 +1,6 @@ --- source: src/tests/issues.rs -expression: "serde_json::from_value::<Option<Options>>(serde_json::json!({}))?.unwrap_or_default()" +expression: "serde_json::from_value::<Option<Options>>(serde_json::json!({})).unwrap().unwrap_or_default()" --- Options { root_directory: None, diff --git a/support/texlab/src/tests/text_document/completion.rs b/support/texlab/src/tests/text_document/completion.rs index d4f256cdfb..7524eb2017 100644 --- a/support/texlab/src/tests/text_document/completion.rs +++ b/support/texlab/src/tests/text_document/completion.rs @@ -791,7 +791,7 @@ fn test_user_environment() { } #[test] -fn test_project_resolution() { +fn test_project_resolution_import() { assert_items!(complete( r#" %TEX main.tex @@ -810,3 +810,25 @@ fn test_project_resolution() { "# )); } + +#[test] +fn test_project_resolution_texlabroot() { + assert_items!(complete( + r#" +%TEX src/main.tex +%SRC \documentclass{article} +%SRC \include{src/foo} +%SRC \lipsu +%CUR ^ +%1.1 ^^^^^ + +%TEX src/foo.tex +%SRC \include{src/bar} + +%TEX src/bar.tex +%SRC \usepackage{lipsum} + +%ROOT .texlabroot +"# + )); +} diff --git a/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution_import.snap index 5ee9c3c207..5ee9c3c207 100644 --- a/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution_import.snap diff --git a/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution_texlabroot.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution_texlabroot.snap new file mode 100644 index 0000000000..ecf093e33c --- /dev/null +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution_texlabroot.snap @@ -0,0 +1,61 @@ +--- +source: src/tests/text_document/completion.rs +expression: "complete(r#\"\n%TEX src/main.tex\n%SRC \\documentclass{article}\n%SRC \\include{src/foo}\n%SRC \\lipsu\n%CUR ^\n%1.1 ^^^^^\n\n%TEX src/foo.tex\n%SRC \\include{src/bar}\n\n%TEX src/bar.tex\n%SRC \\usepackage{lipsum}\n\n%ROOT .texlabroot\n\"#)" +--- +[ + { + "detail": "lipsum.sty", + "kind": 1, + "label": "lipsum", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "lipsum" + } + }, + { + "detail": "lipsum.sty", + "kind": 1, + "label": "lipsumexp", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "lipsumexp" + } + }, + { + "detail": "lipsum.sty", + "kind": 1, + "label": "LipsumPar", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "LipsumPar" + } + }, + { + "detail": "lipsum.sty", + "kind": 1, + "label": "LipsumProtect", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "LipsumProtect" + } + }, + { + "detail": "lipsum.sty", + "kind": 1, + "label": "LipsumRestoreAll", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "LipsumRestoreAll" + } + } +] diff --git a/support/texlab/src/util/cursor.rs b/support/texlab/src/util/cursor.rs index 5c3758ef46..63579c433c 100644 --- a/support/texlab/src/util/cursor.rs +++ b/support/texlab/src/util/cursor.rs @@ -151,7 +151,7 @@ impl<'db, T> CursorContext<'db, T> { let right = root.token_at_offset(offset).right_biased(); Cursor::new_bib(left, right) } - DocumentData::Log(_) => None, + DocumentData::Log(_) | DocumentData::TexlabRoot(_) | DocumentData::Tectonic(_) => None, }; Some(Self { |