summaryrefslogtreecommitdiff
path: root/support/texlab/src/features/link.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/features/link.rs')
-rw-r--r--support/texlab/src/features/link.rs120
1 files changed, 23 insertions, 97 deletions
diff --git a/support/texlab/src/features/link.rs b/support/texlab/src/features/link.rs
index 0a02f7819e..c4ce4413f5 100644
--- a/support/texlab/src/features/link.rs
+++ b/support/texlab/src/features/link.rs
@@ -1,107 +1,33 @@
-use lsp_types::{DocumentLink, DocumentLinkParams};
+mod include;
-use crate::LineIndexExt;
-
-use super::FeatureRequest;
-
-pub fn find_document_links(request: FeatureRequest<DocumentLinkParams>) -> Vec<DocumentLink> {
- let mut links = Vec::new();
- let main_document = request.main_document();
- if let Some(data) = main_document.data.as_latex() {
- for include in &data.extras.explicit_links {
- for target in &include.targets {
- if request
- .workspace
- .documents_by_uri
- .values()
- .any(|document| document.uri.as_ref() == target.as_ref())
- {
- links.push(DocumentLink {
- range: main_document
- .line_index
- .line_col_lsp_range(include.stem_range),
- target: Some(target.as_ref().clone()),
- tooltip: None,
- data: None,
- });
- break;
- }
- }
- }
- }
- links
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- use lsp_types::Range;
-
- use crate::{features::testing::FeatureTester, RangeExt};
-
- #[test]
- fn test_empty_latex_document() {
- let request = FeatureTester::builder()
- .files(vec![("main.tex", "")])
- .main("main.tex")
- .build()
- .link();
+use std::sync::Arc;
- let items = find_document_links(request);
- assert!(items.is_empty());
- }
+use lsp_types::{DocumentLink, DocumentLinkParams, Url};
+use rowan::TextRange;
- #[test]
- fn test_empty_bibtex_document() {
- let request = FeatureTester::builder()
- .files(vec![("main.bib", "")])
- .main("main.bib")
- .build()
- .link();
-
- let items = find_document_links(request);
- assert!(items.is_empty());
- }
+use crate::LineIndexExt;
- #[test]
- fn test_includes() {
- let tester = FeatureTester::builder()
- .files(vec![("foo.tex", r#"\input{bar.tex}"#), ("bar.tex", r#""#)])
- .main("foo.tex")
- .build();
- let target = tester.uri("bar.tex");
+use self::include::find_include_links;
- let actual_items = find_document_links(tester.link());
+use super::FeatureRequest;
- let expected_items = vec![DocumentLink {
- range: Range::new_simple(0, 7, 0, 14),
- target: Some(target.as_ref().clone()),
+pub fn find_document_links(request: FeatureRequest<DocumentLinkParams>) -> Vec<DocumentLink> {
+ let document = request.main_document();
+ let mut results = Vec::new();
+ find_include_links(&request, &mut results);
+ results
+ .into_iter()
+ .map(|result| DocumentLink {
+ range: document.line_index.line_col_lsp_range(result.range),
+ target: Some(result.target.as_ref().clone()),
tooltip: None,
data: None,
- }];
- assert_eq!(actual_items, expected_items);
- }
-
- #[test]
- fn test_imports() {
- let tester = FeatureTester::builder()
- .files(vec![
- ("foo.tex", r#"\import{bar/}{baz}"#),
- ("bar/baz.tex", r#""#),
- ])
- .main("foo.tex")
- .build();
- let target = tester.uri("bar/baz.tex");
-
- let actual_items = find_document_links(tester.link());
+ })
+ .collect()
+}
- let expected_items = vec![DocumentLink {
- range: Range::new_simple(0, 14, 0, 17),
- target: Some(target.as_ref().clone()),
- tooltip: None,
- data: None,
- }];
- assert_eq!(actual_items, expected_items);
- }
+#[derive(Debug, Clone)]
+struct LinkResult {
+ range: TextRange,
+ target: Arc<Url>,
}