texlab/features/definition/
string.rs1use std::sync::Arc;
2
3use lsp_types::GotoDefinitionParams;
4use rowan::ast::AstNode;
5
6use crate::{
7 features::cursor::CursorContext,
8 syntax::bibtex::{self, HasName},
9};
10
11use super::DefinitionResult;
12
13pub(super) fn goto_string_definition(
14 context: &CursorContext<GotoDefinitionParams>,
15) -> Option<Vec<DefinitionResult>> {
16 let main_document = context.request.main_document();
17
18 let data = main_document.data().as_bibtex()?;
19 let key = context
20 .cursor
21 .as_bibtex()
22 .filter(|token| token.kind() == bibtex::NAME)?;
23
24 bibtex::Value::cast(key.parent()?)?;
25
26 let origin_selection_range = key.text_range();
27
28 for string in bibtex::SyntaxNode::new_root(data.green.clone())
29 .children()
30 .filter_map(bibtex::StringDef::cast)
31 {
32 if let Some(string_name) = string.name_token().filter(|k| k.text() == key.text()) {
33 return Some(vec![DefinitionResult {
34 origin_selection_range,
35 target_uri: Arc::clone(main_document.uri()),
36 target_selection_range: string_name.text_range(),
37 target_range: string.syntax().text_range(),
38 }]);
39 }
40 }
41
42 None
43}