summaryrefslogtreecommitdiff
path: root/support/texlab/src/features/definition/document.rs
blob: 1c09bbc88dfe91d03d5b88c53627f366b28427f3 (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
use std::sync::Arc;

use lsp_types::GotoDefinitionParams;
use rowan::TextRange;

use crate::features::cursor::CursorContext;

use super::DefinitionResult;

pub(super) fn goto_document_definition(
    context: &CursorContext<GotoDefinitionParams>,
) -> Option<Vec<DefinitionResult>> {
    let data = context.request.main_document().data.as_latex()?;

    for include in data
        .extras
        .explicit_links
        .iter()
        .filter(|link| link.stem_range.contains_inclusive(context.offset))
    {
        for target in &include.targets {
            if context
                .request
                .workspace
                .documents_by_uri
                .values()
                .any(|document| document.uri.as_ref() == target.as_ref())
            {
                return Some(vec![DefinitionResult {
                    origin_selection_range: include.stem_range,
                    target_uri: Arc::clone(target),
                    target_range: TextRange::default(),
                    target_selection_range: TextRange::default(),
                }]);
            }
        }
    }

    None
}