1
use crate::errors::RecoverableParseError;
2
use crate::parser::syntax_errors::is_malformed_line_error;
3

            
4
const KEYWORDS: [&str; 24] = [
5
    "forall",
6
    "exists",
7
    "such",
8
    "that",
9
    "letting",
10
    "find",
11
    "minimise",
12
    "maximise",
13
    "subject",
14
    "to",
15
    "where",
16
    "and",
17
    "or",
18
    "not",
19
    "if",
20
    "then",
21
    "else",
22
    "in",
23
    "sum",
24
    "product",
25
    "bool",
26
    "pareto",
27
    "minimising",
28
    "maximising",
29
];
30

            
31
18785
pub fn keyword_as_identifier(
32
18785
    root: tree_sitter::Node,
33
18785
    source: &str,
34
18785
    errors: &mut Vec<RecoverableParseError>,
35
18785
) {
36
18785
    let mut stack = vec![root];
37
2143854
    while let Some(node) = stack.pop() {
38
2125253
        if node.is_error() && is_malformed_line_error(&node, source) {
39
184
            return;
40
2125069
        }
41
2125069
        if (node.kind() == "variable" || node.kind() == "identifier" || node.kind() == "parameter")
42
198625
            && let Ok(text) = node.utf8_text(source.as_bytes())
43
        {
44
198625
            let ident = text.trim();
45
198625
            if KEYWORDS.contains(&ident) {
46
106
                let start_point = node.start_position();
47
106
                let end_point = node.end_position();
48
106
                errors.push(RecoverableParseError::new(
49
106
                    format!("Keyword '{ident}' used as identifier"),
50
106
                    Some(tree_sitter::Range {
51
106
                        start_byte: node.start_byte(),
52
106
                        end_byte: node.end_byte(),
53
106
                        start_point,
54
106
                        end_point,
55
106
                    }),
56
106
                ));
57
198519
            }
58
1926444
        }
59

            
60
2125069
        for i in 0..node.child_count() {
61
2106533
            if let Some(child) = u32::try_from(i).ok().and_then(|i| node.child(i)) {
62
2106533
                stack.push(child);
63
2106533
            }
64
        }
65
    }
66
18785
}