diff options
author | Norbert Preining <norbert@preining.info> | 2021-01-07 03:03:02 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2021-01-07 03:03:02 +0000 |
commit | 1dad166b3cb710b4aa32b8c21b91dbca02b2e408 (patch) | |
tree | 42319d2798d99252db2f4341dc6da986d22c5d53 /support/texlab/src | |
parent | 0d181c27aefe5974e97590a4619967a462a5bfe0 (diff) |
CTAN sync 202101070303
Diffstat (limited to 'support/texlab/src')
-rw-r--r-- | support/texlab/src/citeproc/bibutils.rs | 4 | ||||
-rw-r--r-- | support/texlab/src/completion/mod.rs | 42 | ||||
-rw-r--r-- | support/texlab/src/server.rs | 26 | ||||
-rw-r--r-- | support/texlab/src/tex/miktex.rs | 3 | ||||
-rw-r--r-- | support/texlab/src/tex/mod.rs | 2 | ||||
-rw-r--r-- | support/texlab/src/tex/texlive.rs | 4 | ||||
-rw-r--r-- | support/texlab/src/workspace.rs | 35 |
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 { |