texlab/features/definition/
string.rs

1use 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}