summaryrefslogtreecommitdiff
path: root/support/texlab/crates/definition/src
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/crates/definition/src')
-rw-r--r--support/texlab/crates/definition/src/citation.rs5
-rw-r--r--support/texlab/crates/definition/src/command.rs5
-rw-r--r--support/texlab/crates/definition/src/include.rs7
-rw-r--r--support/texlab/crates/definition/src/label.rs7
-rw-r--r--support/texlab/crates/definition/src/lib.rs16
-rw-r--r--support/texlab/crates/definition/src/string_ref.rs5
-rw-r--r--support/texlab/crates/definition/src/tests.rs35
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);
}