summaryrefslogtreecommitdiff
path: root/support/texlab/src
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-01-07 03:03:02 +0000
committerNorbert Preining <norbert@preining.info>2021-01-07 03:03:02 +0000
commit1dad166b3cb710b4aa32b8c21b91dbca02b2e408 (patch)
tree42319d2798d99252db2f4341dc6da986d22c5d53 /support/texlab/src
parent0d181c27aefe5974e97590a4619967a462a5bfe0 (diff)
CTAN sync 202101070303
Diffstat (limited to 'support/texlab/src')
-rw-r--r--support/texlab/src/citeproc/bibutils.rs4
-rw-r--r--support/texlab/src/completion/mod.rs42
-rw-r--r--support/texlab/src/server.rs26
-rw-r--r--support/texlab/src/tex/miktex.rs3
-rw-r--r--support/texlab/src/tex/mod.rs2
-rw-r--r--support/texlab/src/tex/texlive.rs4
-rw-r--r--support/texlab/src/workspace.rs35
7 files changed, 57 insertions, 59 deletions
diff --git a/support/texlab/src/citeproc/bibutils.rs b/support/texlab/src/citeproc/bibutils.rs
index 03a5c2996a..b69ed66ed1 100644
--- a/support/texlab/src/citeproc/bibutils.rs
+++ b/support/texlab/src/citeproc/bibutils.rs
@@ -105,7 +105,7 @@ impl Params {
inner.as_mut_ptr(),
from.read_mode() as i32,
to.write_mode() as i32,
- program.as_ptr() as *mut i8,
+ program.as_ptr() as *mut std::os::raw::c_char,
);
}
Self { inner }
@@ -158,7 +158,7 @@ pub fn convert(input: &str, from: InputFormat, to: OutputFormat) -> Option<Strin
let status = bibl_read(
context.inner.as_mut_ptr(),
input_file.handle,
- input_file.path.as_ptr() as *mut i8,
+ input_file.path.as_ptr() as *mut std::os::raw::c_char,
params.inner.as_mut_ptr(),
);
diff --git a/support/texlab/src/completion/mod.rs b/support/texlab/src/completion/mod.rs
index 1b28f51ebc..d354ed1d98 100644
--- a/support/texlab/src/completion/mod.rs
+++ b/support/texlab/src/completion/mod.rs
@@ -37,7 +37,8 @@ use crate::{
workspace::DocumentContent,
};
use async_trait::async_trait;
-use fuzzy_matcher::skim::fuzzy_match;
+use fuzzy_matcher::FuzzyMatcher;
+use fuzzy_matcher::skim::SkimMatcherV2;
use std::collections::HashSet;
pub const COMPLETION_LIMIT: usize = 50;
@@ -145,27 +146,28 @@ fn preselect(req: &FeatureRequest<CompletionParams>, items: &mut [Item]) {
fn score(req: &FeatureRequest<CompletionParams>, items: &mut Vec<Item>) {
let current_word = current_word(req);
let pattern = current_word.as_deref().unwrap_or_default();
+ let matcher = SkimMatcherV2::default();
for item in items {
item.score = match &item.data {
- ItemData::ComponentCommand { name, .. } => fuzzy_match(name, pattern),
- ItemData::ComponentEnvironment { name, .. } => fuzzy_match(name, pattern),
- ItemData::UserCommand { name } => fuzzy_match(name, pattern),
- ItemData::UserEnvironment { name } => fuzzy_match(name, pattern),
- ItemData::Label { text, .. } => fuzzy_match(&text, pattern),
- ItemData::Class { name } => fuzzy_match(&name, pattern),
- ItemData::Package { name } => fuzzy_match(&name, pattern),
- ItemData::PgfLibrary { name } => fuzzy_match(name, pattern),
- ItemData::TikzLibrary { name } => fuzzy_match(name, pattern),
- ItemData::File { name } => fuzzy_match(name, pattern),
- ItemData::Directory { name } => fuzzy_match(name, pattern),
- ItemData::Citation { text, .. } => fuzzy_match(&text, pattern),
- ItemData::Argument { name, .. } => fuzzy_match(&name, pattern),
- ItemData::BeginCommand => fuzzy_match("begin", pattern),
- ItemData::Color { name } => fuzzy_match(name, pattern),
- ItemData::ColorModel { name } => fuzzy_match(name, pattern),
- ItemData::GlossaryEntry { name } => fuzzy_match(name, pattern),
- ItemData::EntryType { ty } => fuzzy_match(&ty.name, pattern),
- ItemData::Field { field } => fuzzy_match(&field.name, pattern),
+ ItemData::ComponentCommand { name, .. } => matcher.fuzzy_match(name, pattern),
+ ItemData::ComponentEnvironment { name, .. } => matcher.fuzzy_match(name, pattern),
+ ItemData::UserCommand { name } => matcher.fuzzy_match(name, pattern),
+ ItemData::UserEnvironment { name } => matcher.fuzzy_match(name, pattern),
+ ItemData::Label { text, .. } => matcher.fuzzy_match(&text, pattern),
+ ItemData::Class { name } => matcher.fuzzy_match(&name, pattern),
+ ItemData::Package { name } => matcher.fuzzy_match(&name, pattern),
+ ItemData::PgfLibrary { name } => matcher.fuzzy_match(name, pattern),
+ ItemData::TikzLibrary { name } => matcher.fuzzy_match(name, pattern),
+ ItemData::File { name } => matcher.fuzzy_match(name, pattern),
+ ItemData::Directory { name } => matcher.fuzzy_match(name, pattern),
+ ItemData::Citation { text, .. } => matcher.fuzzy_match(&text, pattern),
+ ItemData::Argument { name, .. } => matcher.fuzzy_match(&name, pattern),
+ ItemData::BeginCommand => matcher.fuzzy_match("begin", pattern),
+ ItemData::Color { name } => matcher.fuzzy_match(name, pattern),
+ ItemData::ColorModel { name } => matcher.fuzzy_match(name, pattern),
+ ItemData::GlossaryEntry { name } => matcher.fuzzy_match(name, pattern),
+ ItemData::EntryType { ty } => matcher.fuzzy_match(&ty.name, pattern),
+ ItemData::Field { field } => matcher.fuzzy_match(&field.name, pattern),
};
}
}
diff --git a/support/texlab/src/server.rs b/support/texlab/src/server.rs
index e22fe4f5c9..9c5e1b857b 100644
--- a/support/texlab/src/server.rs
+++ b/support/texlab/src/server.rs
@@ -3,7 +3,7 @@ use crate::citeproc::render_citation;
use crate::{
build::BuildProvider,
- completion::{CompletionItemData, CompletionProvider},
+ completion::{CompletionItemData, CompletionProvider, COMPLETION_LIMIT},
components::COMPONENT_DATABASE,
config::ConfigManager,
definition::DefinitionProvider,
@@ -35,6 +35,7 @@ pub struct LatexLspServer<C> {
distro: Arc<dyn Distribution>,
client: Arc<C>,
client_capabilities: OnceCell<Arc<ClientCapabilities>>,
+ client_info: OnceCell<Option<ClientInfo>>,
current_dir: Arc<PathBuf>,
config_manager: OnceCell<ConfigManager<C>>,
action_manager: ActionManager,
@@ -62,6 +63,7 @@ impl<C: LspClient + Send + Sync + 'static> LatexLspServer<C> {
distro,
client: Arc::clone(&client),
client_capabilities: OnceCell::new(),
+ client_info: OnceCell::new(),
current_dir,
config_manager: OnceCell::new(),
action_manager: ActionManager::default(),
@@ -102,6 +104,10 @@ impl<C: LspClient + Send + Sync + 'static> LatexLspServer<C> {
.set(Arc::new(params.capabilities))
.expect("initialize was called two times");
+ self.client_info
+ .set(params.client_info)
+ .expect("initialize was called two times");
+
let _ = self.config_manager.set(ConfigManager::new(
Arc::clone(&self.client),
self.client_capabilities(),
@@ -253,9 +259,23 @@ impl<C: LspClient + Send + Sync + 'static> LatexLspServer<C> {
req.params.text_document_position.position,
);
+ let items = self.completion_provider.execute(&req).await;
+ let is_incomplete = if self
+ .client_info
+ .get()
+ .and_then(|info| info.as_ref())
+ .map(|info| info.name.as_str())
+ .unwrap_or_default()
+ == "vscode"
+ {
+ true
+ } else {
+ items.len() >= COMPLETION_LIMIT
+ };
+
Ok(CompletionList {
- is_incomplete: true,
- items: self.completion_provider.execute(&req).await,
+ is_incomplete,
+ items,
})
}
diff --git a/support/texlab/src/tex/miktex.rs b/support/texlab/src/tex/miktex.rs
index 9f1551df44..b543aa8a1b 100644
--- a/support/texlab/src/tex/miktex.rs
+++ b/support/texlab/src/tex/miktex.rs
@@ -9,7 +9,6 @@ use futures::lock::Mutex;
use std::{
ffi::OsStr,
io::{self, Cursor},
- mem,
path::{Path, PathBuf},
sync::Arc,
};
@@ -33,7 +32,7 @@ impl Distribution for Miktex {
async fn load(&self) -> Result<(), KpsewhichError> {
let root_directories = kpsewhich::root_directories().await?;
let resolver = kpsewhich::parse_database(&root_directories, read_database).await?;
- mem::replace(&mut *self.resolver.lock().await, Arc::new(resolver));
+ *self.resolver.lock().await = Arc::new(resolver);
Ok(())
}
diff --git a/support/texlab/src/tex/mod.rs b/support/texlab/src/tex/mod.rs
index 6d60380e52..59318f9d22 100644
--- a/support/texlab/src/tex/mod.rs
+++ b/support/texlab/src/tex/mod.rs
@@ -72,7 +72,7 @@ pub enum Language {
impl Language {
pub fn by_extension(extension: &str) -> Option<Self> {
match extension.to_lowercase().as_str() {
- "tex" | "sty" | "cls" | "def" | "lco" | "aux" => Some(Language::Latex),
+ "tex" | "sty" | "cls" | "def" | "lco" | "aux" | "rnw" => Some(Language::Latex),
"bib" | "bibtex" => Some(Language::Bibtex),
_ => None,
}
diff --git a/support/texlab/src/tex/texlive.rs b/support/texlab/src/tex/texlive.rs
index 64bcfebdb7..5afb763d9e 100644
--- a/support/texlab/src/tex/texlive.rs
+++ b/support/texlab/src/tex/texlive.rs
@@ -6,7 +6,7 @@ use super::{
use async_trait::async_trait;
use futures::lock::Mutex;
use std::{
- io, mem,
+ io,
path::{Path, PathBuf},
str::Lines,
sync::Arc,
@@ -31,7 +31,7 @@ impl Distribution for Texlive {
async fn load(&self) -> Result<(), KpsewhichError> {
let root_directories = kpsewhich::root_directories().await?;
let resolver = kpsewhich::parse_database(&root_directories, read_database).await?;
- mem::replace(&mut *self.resolver.lock().await, Arc::new(resolver));
+ *self.resolver.lock().await = Arc::new(resolver);
Ok(())
}
diff --git a/support/texlab/src/workspace.rs b/support/texlab/src/workspace.rs
index 914510dddc..c3c2551325 100644
--- a/support/texlab/src/workspace.rs
+++ b/support/texlab/src/workspace.rs
@@ -9,15 +9,14 @@ use log::{debug, error, warn};
use petgraph::{graph::Graph, visit::Dfs};
use std::{
collections::HashMap,
- error,
ffi::OsStr,
- fmt,
hash::{Hash, Hasher},
io,
path::{Path, PathBuf},
sync::Arc,
time::SystemTime,
};
+use thiserror::Error;
use tokio::fs;
#[derive(Debug, PartialEq, Eq, Clone)]
@@ -307,36 +306,14 @@ impl Snapshot {
}
}
-#[derive(Debug)]
+#[derive(Debug, Error)]
pub enum WorkspaceLoadError {
+ #[error("invalid language id")]
UnknownLanguage,
+ #[error("invalid file path")]
InvalidPath,
- IO(io::Error),
-}
-
-impl From<io::Error> for WorkspaceLoadError {
- fn from(why: io::Error) -> Self {
- Self::IO(why)
- }
-}
-
-impl fmt::Display for WorkspaceLoadError {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- match self {
- Self::UnknownLanguage => write!(f, "Invalid language ID"),
- Self::InvalidPath => write!(f, "Invalid file path"),
- Self::IO(why) => write!(f, "{}", why),
- }
- }
-}
-
-impl error::Error for WorkspaceLoadError {
- fn source(&self) -> Option<&(dyn error::Error + 'static)> {
- match self {
- Self::UnknownLanguage | Self::InvalidPath => None,
- Self::IO(why) => why.source(),
- }
- }
+ #[error("an I/O error occurred: `{0}`")]
+ IO(#[from] io::Error),
}
pub struct Workspace {