diff options
Diffstat (limited to 'support/texlab/crates/definition/src')
-rw-r--r-- | support/texlab/crates/definition/src/citation.rs | 5 | ||||
-rw-r--r-- | support/texlab/crates/definition/src/command.rs | 5 | ||||
-rw-r--r-- | support/texlab/crates/definition/src/include.rs | 7 | ||||
-rw-r--r-- | support/texlab/crates/definition/src/label.rs | 7 | ||||
-rw-r--r-- | support/texlab/crates/definition/src/lib.rs | 16 | ||||
-rw-r--r-- | support/texlab/crates/definition/src/string_ref.rs | 5 | ||||
-rw-r--r-- | support/texlab/crates/definition/src/tests.rs | 35 |
7 files changed, 32 insertions, 48 deletions
diff --git a/support/texlab/crates/definition/src/citation.rs b/support/texlab/crates/definition/src/citation.rs index 509b008b26..52c0636e2d 100644 --- a/support/texlab/crates/definition/src/citation.rs +++ b/support/texlab/crates/definition/src/citation.rs @@ -8,7 +8,8 @@ use crate::DefinitionContext; use super::DefinitionResult; pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> { - let data = context.params.document.data.as_tex()?; + let feature = &context.params.feature; + let data = feature.document.data.as_tex()?; let citation = queries::object_at_cursor( &data.semantics.citations, @@ -17,7 +18,7 @@ pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> { )?; let name = citation.object.name_text(); - for (document, entry) in queries::objects_with_name::<bib::Entry>(&context.project, name) { + for (document, entry) in queries::objects_with_name::<bib::Entry>(&feature.project, name) { context.results.insert(DefinitionResult { origin_selection_range: citation.object.name_range(), target: document, diff --git a/support/texlab/crates/definition/src/command.rs b/support/texlab/crates/definition/src/command.rs index 661f953212..d618ca9ddf 100644 --- a/support/texlab/crates/definition/src/command.rs +++ b/support/texlab/crates/definition/src/command.rs @@ -7,7 +7,8 @@ use crate::DefinitionContext; use super::DefinitionResult; pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> { - let data = context.params.document.data.as_tex()?; + let feature = &context.params.feature; + let data = feature.document.data.as_tex()?; let root = data.root_node(); let name = root .token_at_offset(context.params.offset) @@ -15,7 +16,7 @@ pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> { let origin_selection_range = name.text_range(); - for document in &context.project.documents { + for document in &feature.project.documents { let DocumentData::Tex(data) = &document.data else { continue; }; diff --git a/support/texlab/crates/definition/src/include.rs b/support/texlab/crates/definition/src/include.rs index df2c5c763c..bc9311ba01 100644 --- a/support/texlab/crates/definition/src/include.rs +++ b/support/texlab/crates/definition/src/include.rs @@ -5,12 +5,13 @@ use crate::DefinitionContext; use super::DefinitionResult; pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> { - let start = context.params.document; - let parents = context.params.workspace.parents(start); + let feature = &context.params.feature; + let start = feature.document; + let parents = feature.workspace.parents(start); let results = parents .into_iter() .chain(std::iter::once(start)) - .flat_map(|parent| base_db::graph::Graph::new(context.params.workspace, parent).edges) + .flat_map(|parent| base_db::graph::Graph::new(feature.workspace, parent).edges) .filter(|edge| edge.source == start) .flat_map(|edge| { let origin_selection_range = edge.weight?.link.path.range; diff --git a/support/texlab/crates/definition/src/label.rs b/support/texlab/crates/definition/src/label.rs index 80f1442daf..e32c0a93d0 100644 --- a/support/texlab/crates/definition/src/label.rs +++ b/support/texlab/crates/definition/src/label.rs @@ -11,7 +11,8 @@ use crate::DefinitionContext; use super::DefinitionResult; pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> { - let data = context.params.document.data.as_tex()?; + let feature = &context.params.feature; + let data = feature.document.data.as_tex()?; let reference = queries::object_at_cursor( &data.semantics.labels, context.params.offset, @@ -19,10 +20,10 @@ pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> { )?; let name = reference.object.name_text(); - let labels = queries::objects_with_name::<tex::Label>(&context.project, name); + let labels = queries::objects_with_name::<tex::Label>(&feature.project, name); for (document, label) in labels.filter(|(_, label)| label.kind == tex::LabelKind::Definition) { let target_selection_range = label.name.range; - let target_range = render_label(context.params.workspace, &context.project, label) + let target_range = render_label(feature.workspace, &feature.project, label) .map_or(target_selection_range, |label| label.range); context.results.insert(DefinitionResult { diff --git a/support/texlab/crates/definition/src/lib.rs b/support/texlab/crates/definition/src/lib.rs index 2c1614f04e..55319b7fe4 100644 --- a/support/texlab/crates/definition/src/lib.rs +++ b/support/texlab/crates/definition/src/lib.rs @@ -4,14 +4,13 @@ mod include; mod label; mod string_ref; -use base_db::{Document, Project, Workspace}; +use base_db::{Document, FeatureParams}; use rowan::{TextRange, TextSize}; use rustc_hash::FxHashSet; #[derive(Debug)] -pub struct DefinitionParams<'db> { - pub workspace: &'db Workspace, - pub document: &'db Document, +pub struct DefinitionParams<'a> { + pub feature: FeatureParams<'a>, pub offset: TextSize, } @@ -24,17 +23,14 @@ pub struct DefinitionResult<'a> { } #[derive(Debug)] -struct DefinitionContext<'db> { - params: DefinitionParams<'db>, - project: Project<'db>, - results: FxHashSet<DefinitionResult<'db>>, +struct DefinitionContext<'a> { + params: DefinitionParams<'a>, + results: FxHashSet<DefinitionResult<'a>>, } pub fn goto_definition(params: DefinitionParams) -> FxHashSet<DefinitionResult> { - let project = params.workspace.project(params.document); let mut context = DefinitionContext { params, - project, results: FxHashSet::default(), }; diff --git a/support/texlab/crates/definition/src/string_ref.rs b/support/texlab/crates/definition/src/string_ref.rs index 678fc5911e..48af5c725e 100644 --- a/support/texlab/crates/definition/src/string_ref.rs +++ b/support/texlab/crates/definition/src/string_ref.rs @@ -6,7 +6,8 @@ use crate::DefinitionContext; use super::DefinitionResult; pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> { - let data = context.params.document.data.as_bib()?; + let feature = &context.params.feature; + let data = feature.document.data.as_bib()?; let root = data.root_node(); let name = root .token_at_offset(context.params.offset) @@ -25,7 +26,7 @@ pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> { { context.results.insert(DefinitionResult { origin_selection_range, - target: context.params.document, + target: feature.document, target_range: string.full_range, target_selection_range: string.name.range, }); diff --git a/support/texlab/crates/definition/src/tests.rs b/support/texlab/crates/definition/src/tests.rs index 8c08be72d1..8d81927d32 100644 --- a/support/texlab/crates/definition/src/tests.rs +++ b/support/texlab/crates/definition/src/tests.rs @@ -1,35 +1,22 @@ +use rowan::TextRange; use rustc_hash::FxHashSet; use crate::{DefinitionParams, DefinitionResult}; fn check(input: &str) { let fixture = test_utils::fixture::Fixture::parse(input); - let workspace = &fixture.workspace; - - let mut origin_selection_range = None; - let mut origin_document = None; - let mut origin_cursor = None; - for document in &fixture.documents { - if let Some(cursor) = document.cursor { - origin_document = Some(document); - origin_cursor = Some(cursor); - origin_selection_range = document - .ranges - .iter() - .find(|range| range.contains_inclusive(cursor)) - .copied(); - - break; - } - } - - let origin_document = origin_document.unwrap(); + let (feature, offset) = fixture.make_params().unwrap(); + let origin_document = feature.document; + let origin_selection_range = fixture + .locations() + .filter(|location| location.document == origin_document) + .find(|location| location.range.contains_inclusive(offset)) + .map_or_else(|| TextRange::default(), |location| location.range); let mut expected = FxHashSet::default(); for document in &fixture.documents { let mut ranges = document.ranges.iter(); while let Some(target_selection_range) = ranges.next().copied() { - let origin_selection_range = origin_selection_range.unwrap(); if (&origin_document.uri, origin_selection_range) != (&document.uri, target_selection_range) { @@ -43,11 +30,7 @@ fn check(input: &str) { } } - let actual = crate::goto_definition(DefinitionParams { - workspace, - document: workspace.lookup(&origin_document.uri).unwrap(), - offset: origin_cursor.unwrap(), - }); + let actual = crate::goto_definition(DefinitionParams { feature, offset }); assert_eq!(actual, expected); } |