summaryrefslogtreecommitdiff
path: root/support/texlab/src/features/definition/label.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/features/definition/label.rs')
-rw-r--r--support/texlab/src/features/definition/label.rs77
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());
- }
-}