diff options
Diffstat (limited to 'support/texlab/src/features/definition/document.rs')
-rw-r--r-- | support/texlab/src/features/definition/document.rs | 132 |
1 files changed, 32 insertions, 100 deletions
diff --git a/support/texlab/src/features/definition/document.rs b/support/texlab/src/features/definition/document.rs index 2a93232cd7..1c09bbc88d 100644 --- a/support/texlab/src/features/definition/document.rs +++ b/support/texlab/src/features/definition/document.rs @@ -1,108 +1,40 @@ -use lsp_types::{GotoDefinitionParams, LocationLink, Range}; +use std::sync::Arc; -use crate::{features::cursor::CursorContext, LineIndexExt, RangeExt}; +use lsp_types::GotoDefinitionParams; +use rowan::TextRange; -pub fn goto_document_definition( +use crate::features::cursor::CursorContext; + +use super::DefinitionResult; + +pub(super) fn goto_document_definition( context: &CursorContext<GotoDefinitionParams>, -) -> Option<Vec<LocationLink>> { - let main_document = context.request.main_document(); - if let Some(data) = main_document.data.as_latex() { - for include in data - .extras - .explicit_links - .iter() - .filter(|link| link.stem_range.contains_inclusive(context.offset)) - { - for target in &include.targets { - if context - .request - .workspace - .documents_by_uri - .values() - .any(|document| document.uri.as_ref() == target.as_ref()) - { - return Some(vec![LocationLink { - origin_selection_range: Some( - main_document - .line_index - .line_col_lsp_range(include.stem_range), - ), - target_uri: target.as_ref().clone(), - target_range: Range::new_simple(0, 0, 0, 0), - target_selection_range: Range::new_simple(0, 0, 0, 0), - }]); - } +) -> Option<Vec<DefinitionResult>> { + let data = context.request.main_document().data.as_latex()?; + + for include in data + .extras + .explicit_links + .iter() + .filter(|link| link.stem_range.contains_inclusive(context.offset)) + { + for target in &include.targets { + if context + .request + .workspace + .documents_by_uri + .values() + .any(|document| document.uri.as_ref() == target.as_ref()) + { + return Some(vec![DefinitionResult { + origin_selection_range: include.stem_range, + target_uri: Arc::clone(target), + target_range: TextRange::default(), + target_selection_range: TextRange::default(), + }]); } } } - None -} - -#[cfg(test)] -mod tests { - use lsp_types::Range; - - use crate::{features::testing::FeatureTester, RangeExt}; - - use super::*; - - #[test] - fn test_empty_latex_document() { - let request = FeatureTester::builder() - .files(vec![("main.tex", "")]) - .main("main.tex") - .line(0) - .character(0) - .build() - .definition(); - - let context = CursorContext::new(request); - let actual_links = goto_document_definition(&context); - - assert!(actual_links.is_none()); - } - - #[test] - fn test_empty_bibtex_document() { - let request = FeatureTester::builder() - .files(vec![("main.bib", "")]) - .main("main.bib") - .line(0) - .character(0) - .build() - .definition(); - - let context = CursorContext::new(request); - let actual_links = goto_document_definition(&context); - - assert!(actual_links.is_none()); - } - #[test] - fn test_simple() { - let tester = FeatureTester::builder() - .files(vec![ - ("foo.tex", r#"\addbibresource{baz.bib}"#), - ("bar.bib", r#"@article{foo, bar = {baz}}"#), - ("baz.bib", r#"@article{foo, bar = {baz}}"#), - ]) - .main("foo.tex") - .line(0) - .character(18) - .build(); - let target_uri = tester.uri("baz.bib").as_ref().clone(); - - let request = tester.definition(); - let context = CursorContext::new(request); - let actual_links = goto_document_definition(&context).unwrap(); - - let expected_links = vec![LocationLink { - origin_selection_range: Some(Range::new_simple(0, 16, 0, 23)), - target_uri, - target_range: Range::new_simple(0, 0, 0, 0), - target_selection_range: Range::new_simple(0, 0, 0, 0), - }]; - - assert_eq!(actual_links, expected_links); - } + None } |