blob: ea7ef8c2c21081519a560b038b647939737c60e2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
use base_db::DocumentData;
use rowan::{ast::AstNode, TextRange};
use syntax::latex;
use crate::DefinitionContext;
use super::DefinitionResult;
pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> {
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)
.find(|token| token.kind() == latex::COMMAND_NAME)?;
let origin_selection_range = name.text_range();
for document in &feature.project.documents {
let DocumentData::Tex(data) = &document.data else {
continue;
};
let results = data
.root_node()
.descendants()
.filter_map(|node| {
process_old_definition(node.clone()).or_else(|| process_new_definition(node))
})
.filter(|(_, command)| command.text() == name.text())
.map(|(target_range, command)| DefinitionResult {
origin_selection_range,
target: document,
target_range,
target_selection_range: command.text_range(),
});
context.results.extend(results);
}
Some(())
}
fn process_old_definition(node: latex::SyntaxNode) -> Option<(TextRange, latex::SyntaxToken)> {
let node = latex::OldCommandDefinition::cast(node)?;
let name = node.name()?;
Some((latex::small_range(&node), name))
}
fn process_new_definition(node: latex::SyntaxNode) -> Option<(TextRange, latex::SyntaxToken)> {
let node = latex::NewCommandDefinition::cast(node)?;
let name = node.name()?.command()?;
Some((latex::small_range(&node), name))
}
|