diff options
Diffstat (limited to 'support/texlab/src/features/definition/label.rs')
-rw-r--r-- | support/texlab/src/features/definition/label.rs | 37 |
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, }]); |