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.rs37
1 files changed, 19 insertions, 18 deletions
diff --git a/support/texlab/src/features/definition/label.rs b/support/texlab/src/features/definition/label.rs
index 867e8a1076..a1cc4ed15b 100644
--- a/support/texlab/src/features/definition/label.rs
+++ b/support/texlab/src/features/definition/label.rs
@@ -1,31 +1,32 @@
-use std::sync::Arc;
-
-use lsp_types::GotoDefinitionParams;
-
-use crate::{features::cursor::CursorContext, find_label_definition, render_label, syntax::latex};
+use crate::{
+ db::analysis::label,
+ util::{self, cursor::CursorContext},
+};
use super::DefinitionResult;
-pub(super) fn goto_label_definition(
- context: &CursorContext<GotoDefinitionParams>,
-) -> Option<Vec<DefinitionResult>> {
+pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> {
+ let db = context.db;
let (name_text, origin_selection_range) = context
.find_label_name_key()
.or_else(|| context.find_label_name_command())?;
- for document in context.request.workspace.documents_by_uri.values() {
- if let Some(data) = document.data.as_latex() {
- 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);
+ for document in context.related() {
+ if let Some(data) = document.parse(db).as_tex() {
+ if let Some(label) = data
+ .analyze(db)
+ .labels(db)
+ .iter()
+ .filter(|label| matches!(label.origin(db), label::Origin::Definition(_)))
+ .find(|label| label.name(db).text(db) == name_text.as_str())
+ {
+ let target_selection_range = label.range(db);
+ let target_range = util::label::render(db, document, *label)
+ .map_or(target_selection_range, |label| label.range);
return Some(vec![DefinitionResult {
origin_selection_range,
- target_uri: Arc::clone(&document.uri),
+ target: document,
target_range,
target_selection_range,
}]);