summaryrefslogtreecommitdiff
path: root/support/texlab/src/syntax/latex/analysis/label_name.rs
blob: d0410b953cd0af0216e0c1f627e60964686cfa5f (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()?.word()?;
    context.extras.label_names.push(LabelName {
        text: name.text().into(),
        range: name.text_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()?.words() {
        context.extras.label_names.push(LabelName {
            text: name.text().into(),
            range: name.text_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.word()) {
        context.extras.label_names.push(LabelName {
            text: name1.text().into(),
            range: name1.text_range(),
            is_definition: false,
        });
    }

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