diff options
Diffstat (limited to 'support/texlab/src/syntax/latex/analysis/explicit_link.rs')
-rw-r--r-- | support/texlab/src/syntax/latex/analysis/explicit_link.rs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/support/texlab/src/syntax/latex/analysis/explicit_link.rs b/support/texlab/src/syntax/latex/analysis/explicit_link.rs new file mode 100644 index 0000000000..363a576aaa --- /dev/null +++ b/support/texlab/src/syntax/latex/analysis/explicit_link.rs @@ -0,0 +1,72 @@ +use std::sync::Arc; + +use crate::syntax::{latex, CstNode}; + +use super::{ + distro_file::resolve_distro_file, ExplicitLink, ExplicitLinkKind, LatexAnalyzerContext, +}; + +pub fn analyze_include(context: &mut LatexAnalyzerContext, node: &latex::SyntaxNode) -> Option<()> { + let include = latex::Include::cast(node)?; + let kind = match include.syntax().kind() { + latex::LATEX_INCLUDE => ExplicitLinkKind::Latex, + latex::BIBLATEX_INCLUDE | latex::BIBTEX_INCLUDE => ExplicitLinkKind::Bibtex, + latex::PACKAGE_INCLUDE => ExplicitLinkKind::Package, + latex::CLASS_INCLUDE => ExplicitLinkKind::Class, + _ => return None, + }; + + let extensions = match kind { + ExplicitLinkKind::Latex => &["tex"], + ExplicitLinkKind::Bibtex => &["bib"], + ExplicitLinkKind::Package => &["sty"], + ExplicitLinkKind::Class => &["cls"], + }; + + for path in include.path_list()?.words() { + let stem = path.text(); + let mut targets = vec![Arc::new(context.base_uri.join(stem).ok()?.into())]; + for extension in extensions { + let path = format!("{}.{}", stem, extension); + targets.push(Arc::new(context.base_uri.join(&path).ok()?.into())); + } + + resolve_distro_file(&context.inner.resolver.lock().unwrap(), stem, extensions) + .into_iter() + .for_each(|target| targets.push(Arc::new(target))); + + context.extras.explicit_links.push(ExplicitLink { + kind, + stem: stem.into(), + stem_range: path.text_range(), + targets, + }); + } + + Some(()) +} + +pub fn analyze_import(context: &mut LatexAnalyzerContext, node: &latex::SyntaxNode) -> Option<()> { + let import = latex::Import::cast(node)?; + + let mut targets = Vec::new(); + let directory = context + .base_uri + .join(import.directory()?.word()?.text()) + .ok()?; + + let file = import.file()?.word()?; + let stem = file.text(); + targets.push(Arc::new(directory.join(stem).ok()?.into())); + targets.push(Arc::new( + directory.join(&format!("{}.tex", stem)).ok()?.into(), + )); + + context.extras.explicit_links.push(ExplicitLink { + stem: stem.into(), + stem_range: file.text_range(), + targets, + kind: ExplicitLinkKind::Latex, + }); + Some(()) +} |