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