diff options
Diffstat (limited to 'support/texlab/src/syntax/latex/analysis/implicit_link.rs')
-rw-r--r-- | support/texlab/src/syntax/latex/analysis/implicit_link.rs | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/support/texlab/src/syntax/latex/analysis/implicit_link.rs b/support/texlab/src/syntax/latex/analysis/implicit_link.rs index 74055b3e31..bba3acfb80 100644 --- a/support/texlab/src/syntax/latex/analysis/implicit_link.rs +++ b/support/texlab/src/syntax/latex/analysis/implicit_link.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use crate::Uri; +use lsp_types::Url; use super::LatexAnalyzerContext; @@ -10,32 +10,41 @@ pub fn analyze_implicit_links(context: &mut LatexAnalyzerContext) { context.extras.implicit_links.pdf = find_by_extension(context, "pdf").unwrap_or_default(); } -fn find_by_extension(context: &LatexAnalyzerContext, extension: &str) -> Option<Vec<Arc<Uri>>> { - let mut targets: Vec<Arc<Uri>> = Vec::new(); - targets.push(Arc::new(context.document_uri.with_extension(extension)?)); +fn find_by_extension(context: &LatexAnalyzerContext, extension: &str) -> Option<Vec<Arc<Url>>> { + let mut targets = vec![Arc::new(with_extension(&context.document_uri, extension)?)]; if context.document_uri.scheme() == "file" { let file_path = context.document_uri.to_file_path().ok()?; let file_stem = file_path.file_stem()?; let aux_name = format!("{}.{}", file_stem.to_str()?, extension); - let options = context.inner.options.read().unwrap(); + let options = &context.environment.options; if let Some(root_dir) = options.root_directory.as_ref() { let path = context - .inner + .environment .current_directory .join(root_dir) .join(&aux_name); - targets.push(Arc::new(Uri::from_file_path(path).ok()?)); + targets.push(Arc::new(Url::from_file_path(path).ok()?)); } if let Some(build_dir) = options.aux_directory.as_ref() { let path = context - .inner + .environment .current_directory .join(build_dir) .join(&aux_name); - targets.push(Arc::new(Uri::from_file_path(path).ok()?)); + targets.push(Arc::new(Url::from_file_path(path).ok()?)); } } Some(targets) } + +fn with_extension(uri: &Url, extension: &str) -> Option<Url> { + let file_name = uri.path_segments()?.last()?; + let file_stem = file_name + .rfind('.') + .map(|i| &file_name[..i]) + .unwrap_or(file_name); + + uri.join(&format!("{}.{}", file_stem, extension)).ok() +} |