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
19084
pub fn keyword_as_identifier(
32
19084
    root: tree_sitter::Node,
33
19084
    source: &str,
34
19084
    errors: &mut Vec<RecoverableParseError>,
35
19084
) {
36
19084
    let mut stack = vec![root];
37
2162574
    while let Some(node) = stack.pop() {
38
2143674
        if node.is_error() && is_malformed_line_error(&node, source) {
39
184
            return;
40
2143490
        }
41
2143490
        if (node.kind() == "variable" || node.kind() == "identifier" || node.kind() == "parameter")
42
199938
            && let Ok(text) = node.utf8_text(source.as_bytes())
43
        {
44
199938
            let ident = text.trim();
45
199938
            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
199832
            }
58
1943552
        }
59

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