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
use cairo_lang_syntax::node::kind::SyntaxKind;

pub fn get_unary_operator_precedence(kind: SyntaxKind) -> Option<usize> {
    if [SyntaxKind::TerminalNot, SyntaxKind::TerminalMinus].contains(&kind) {
        get_binary_operator_precedence(kind)
    } else {
        None
    }
}
pub fn get_binary_operator_precedence(kind: SyntaxKind) -> Option<usize> {
    match kind {
        // TODO(spapini): This should precede unary operators.
        SyntaxKind::TerminalDot => Some(0),

        // TODO(yuval): support unary-only/non-binary operators. "not" can't be binary.
        SyntaxKind::TerminalNot => Some(1),
        SyntaxKind::TerminalMul | SyntaxKind::TerminalDiv | SyntaxKind::TerminalMod => Some(2),
        SyntaxKind::TerminalPlus | SyntaxKind::TerminalMinus => Some(3),
        SyntaxKind::TerminalEqEq
        | SyntaxKind::TerminalNeq
        | SyntaxKind::TerminalLT
        | SyntaxKind::TerminalGT
        | SyntaxKind::TerminalLE
        | SyntaxKind::TerminalGE => Some(4),
        SyntaxKind::TerminalAnd => Some(5),
        SyntaxKind::TerminalOr => Some(6),
        SyntaxKind::TerminalXor => Some(7),
        SyntaxKind::TerminalEq => Some(8),

        // TODO(yuval): add more operators.
        _ => None,
    }
}