texlab 4.3.2

LaTeX Language Server
Documentation
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 document = context.request.main_document();
    let data = 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.get(&target).is_some() {
                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
}