diff options
Diffstat (limited to 'support/texlab/src/features/definition/document.rs')
-rw-r--r-- | support/texlab/src/features/definition/document.rs | 50 |
1 files changed, 20 insertions, 30 deletions
diff --git a/support/texlab/src/features/definition/document.rs b/support/texlab/src/features/definition/document.rs index 1c09bbc88d..58237f7521 100644 --- a/support/texlab/src/features/definition/document.rs +++ b/support/texlab/src/features/definition/document.rs @@ -1,40 +1,30 @@ -use std::sync::Arc; - -use lsp_types::GotoDefinitionParams; use rowan::TextRange; -use crate::features::cursor::CursorContext; +use crate::{db::dependency_graph, util::cursor::CursorContext}; use super::DefinitionResult; -pub(super) fn goto_document_definition( - context: &CursorContext<GotoDefinitionParams>, -) -> Option<Vec<DefinitionResult>> { - let data = context.request.main_document().data.as_latex()?; - - for include in data - .extras - .explicit_links +pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> { + let db = context.db; + context + .workspace + .parents(db, context.document) .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), + .copied() + .chain(std::iter::once(context.document)) + .flat_map(|parent| dependency_graph(db, parent).edges) + .filter(|edge| edge.source == context.document) + .find_map(|edge| { + let range = edge.origin?.link.range(db); + if range.contains_inclusive(context.offset) { + Some(vec![DefinitionResult { + origin_selection_range: range, + target: edge.target, target_range: TextRange::default(), target_selection_range: TextRange::default(), - }]); + }]) + } else { + None } - } - } - - None + }) } |