diff options
Diffstat (limited to 'support/texlab/src/features/definition/label.rs')
-rw-r--r-- | support/texlab/src/features/definition/label.rs | 77 |
1 files changed, 16 insertions, 61 deletions
diff --git a/support/texlab/src/features/definition/label.rs b/support/texlab/src/features/definition/label.rs index e5ccd49937..867e8a1076 100644 --- a/support/texlab/src/features/definition/label.rs +++ b/support/texlab/src/features/definition/label.rs @@ -1,39 +1,33 @@ -use lsp_types::{GotoDefinitionParams, LocationLink}; +use std::sync::Arc; -use crate::{ - features::cursor::CursorContext, find_label_definition, render_label, syntax::latex, - LineIndexExt, -}; +use lsp_types::GotoDefinitionParams; -pub fn goto_label_definition( - context: &CursorContext<GotoDefinitionParams>, -) -> Option<Vec<LocationLink>> { - let main_document = context.request.main_document(); +use crate::{features::cursor::CursorContext, find_label_definition, render_label, syntax::latex}; + +use super::DefinitionResult; - let (name_text, name_range) = context +pub(super) fn goto_label_definition( + context: &CursorContext<GotoDefinitionParams>, +) -> Option<Vec<DefinitionResult>> { + let (name_text, origin_selection_range) = context .find_label_name_key() .or_else(|| context.find_label_name_command())?; - let origin_selection_range = main_document.line_index.line_col_lsp_range(name_range); - for document in context.request.workspace.documents_by_uri.values() { if let Some(data) = document.data.as_latex() { - if let Some(definition) = - find_label_definition(&latex::SyntaxNode::new_root(data.green.clone()), &name_text) - { + let root = latex::SyntaxNode::new_root(data.green.clone()); + if let Some(definition) = find_label_definition(&root, &name_text) { let target_selection_range = latex::small_range(&definition.name()?.key()?); let target_range = render_label(&context.request.workspace, &name_text, Some(definition)) .map(|label| label.range) .unwrap_or(target_selection_range); - return Some(vec![LocationLink { - origin_selection_range: Some(origin_selection_range), - target_uri: document.uri.as_ref().clone(), - target_range: document.line_index.line_col_lsp_range(target_range), - target_selection_range: document - .line_index - .line_col_lsp_range(target_selection_range), + return Some(vec![DefinitionResult { + origin_selection_range, + target_uri: Arc::clone(&document.uri), + target_range, + target_selection_range, }]); } } @@ -41,42 +35,3 @@ pub fn goto_label_definition( None } - -#[cfg(test)] -mod tests { - use crate::features::testing::FeatureTester; - - 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_label_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_label_definition(&context); - - assert!(actual_links.is_none()); - } -} |