summaryrefslogtreecommitdiff
path: root/support/texlab/src
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src')
-rw-r--r--support/texlab/src/db/diagnostics.rs1
-rw-r--r--support/texlab/src/db/discovery.rs14
-rw-r--r--support/texlab/src/db/document.rs44
-rw-r--r--support/texlab/src/db/parse.rs8
-rw-r--r--support/texlab/src/db/workspace.rs49
-rw-r--r--support/texlab/src/features/build.rs20
-rw-r--r--support/texlab/src/features/folding.rs4
-rw-r--r--support/texlab/src/features/formatting.rs2
-rw-r--r--support/texlab/src/features/reference/entry.rs5
-rw-r--r--support/texlab/src/features/rename/entry.rs2
-rw-r--r--support/texlab/src/server.rs10
-rw-r--r--support/texlab/src/tests/fixture.rs4
-rw-r--r--support/texlab/src/tests/snapshots/texlab__tests__issues__issue_707.snap2
-rw-r--r--support/texlab/src/tests/text_document/completion.rs24
-rw-r--r--support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution_import.snap (renamed from support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution.snap)0
-rw-r--r--support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution_texlabroot.snap61
-rw-r--r--support/texlab/src/util/cursor.rs2
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 {