summaryrefslogtreecommitdiff
path: root/support/texlab/crates/texlab/src/features/inlay_hint/label.rs
blob: f73d3fd9ae8c45d9af587a0cceac84ba00e981a2 (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
use base_db::{
    semantics::tex::LabelKind,
    util::{render_label, RenderedObject},
    DocumentData,
};

use super::InlayHintBuilder;

pub(super) fn find_hints(builder: &mut InlayHintBuilder) -> Option<()> {
    let DocumentData::Tex(data) = &builder.document.data else { return None };

    let range = builder.range;
    for label in data
        .semantics
        .labels
        .iter()
        .filter(|label| label.kind == LabelKind::Definition)
        .filter(|label| label.name.range.intersect(range).is_some())
    {
        let Some(rendered) = render_label(builder.workspace, &builder.project, label) else { continue };
        let Some(number) = &rendered.number else { continue };

        let text = match &rendered.object {
            RenderedObject::Section { prefix, .. } => {
                format!("{} {}", prefix, number)
            }
            RenderedObject::Float { kind, .. } => {
                format!("{} {}", kind.as_str(), number)
            }
            RenderedObject::Theorem { kind, .. } => {
                format!("{} {}", kind, number)
            }
            RenderedObject::Equation => format!("Equation ({})", number),
            RenderedObject::EnumItem => format!("Item {}", number),
        };

        builder.push(label.full_range.end(), text);
    }

    Some(())
}