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
use crate::code_point::CodePoint;
use crate::structure::Located;
use crate::structure::rlt::{Body, Operation};
use crate::structure::rlt::new_types::Keyword;

#[derive(Clone, Debug, PartialEq)]
pub struct IfExpr {
    pub keyword: Keyword,
    pub condition: Operation,
    pub body: Body,
    pub elif: Box<[ElifExpr]>,
    pub el: Option<ElseExpr>,
}

#[derive(Clone, Debug, PartialEq)]
pub struct ElifExpr {
    pub keyword: Keyword,
    pub condition: Operation,
    pub body: Body,
}

#[derive(Clone, Debug, PartialEq)]
pub struct ElseExpr {
    pub keyword: Keyword,
    pub body: Body,
}

#[derive(Clone, Debug, PartialEq)]
pub enum CodeFlow {
    If(IfExpr),
}

impl Located for IfExpr {
    fn location(&self) -> CodePoint {
        self.keyword.location()
    }
}

impl Located for ElifExpr {
    fn location(&self) -> CodePoint {
        self.keyword.location()
    }
}

impl Located for ElseExpr {
    fn location(&self) -> CodePoint {
        self.keyword.location()
    }
}

impl Located for CodeFlow {
    fn location(&self) -> CodePoint {
        match self {
            CodeFlow::If(x) => x.location(),
        }
    }
}