summaryrefslogtreecommitdiff
path: root/support/texlab/src/syntax/latex/analysis/label_name.rs
blob: e5ff6829cd3e4fa12a7169a868ba266d5c6cb6d8 (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use latex::LabelReferenceRange;

use crate::syntax::{latex, CstNode};

use super::{LabelName, LatexAnalyzerContext};

pub fn analyze_label_name(
    context: &mut LatexAnalyzerContext,
    node: &latex::SyntaxNode,
) -> Option<()> {
    analyze_label_definition_name(context, node)
        .or_else(|| analyze_label_reference_name(context, node))
        .or_else(|| analyze_label_reference_range_name(context, node))
}

fn analyze_label_definition_name(
    context: &mut LatexAnalyzerContext,
    node: &latex::SyntaxNode,
) -> Option<()> {
    let label = latex::LabelDefinition::cast(node)?;
    let name = label.name()?.key()?;
    context.extras.label_names.push(LabelName {
        text: name.to_string().into(),
        range: name.small_range(),
        is_definition: true,
    });
    Some(())
}

fn analyze_label_reference_name(
    context: &mut LatexAnalyzerContext,
    node: &latex::SyntaxNode,
) -> Option<()> {
    let label = latex::LabelReference::cast(node)?;
    for name in label.name_list()?.keys() {
        context.extras.label_names.push(LabelName {
            text: name.to_string().into(),
            range: name.small_range(),
            is_definition: false,
        });
    }
    Some(())
}

fn analyze_label_reference_range_name(
    context: &mut LatexAnalyzerContext,
    node: &latex::SyntaxNode,
) -> Option<()> {
    let label = LabelReferenceRange::cast(node)?;
    if let Some(name1) = label.from().and_then(|name| name.key()) {
        context.extras.label_names.push(LabelName {
            text: name1.to_string().into(),
            range: name1.small_range(),
            is_definition: false,
        });
    }

    if let Some(name2) = label.to().and_then(|name| name.key()) {
        context.extras.label_names.push(LabelName {
            text: name2.to_string().into(),
            range: name2.small_range(),
            is_definition: false,
        });
    }
    Some(())
}