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
use crate::mir::expr::Expr;
#[derive(Debug, PartialEq)]
pub struct TypeCheckError {
msg: String,
}
impl TypeCheckError {
pub fn new(msg: String) -> Self {
Self { msg }
}
pub fn pretty_desc(&self) -> String {
self.msg.clone()
}
}
pub fn type_check(e: Expr) -> Result<Expr, TypeCheckError> {
match &e {
Expr::BinOp(bin) => {
if bin.left.tpe() == bin.right.tpe() {
Ok(e)
} else {
Err(TypeCheckError::new(format!(
"Type check error: binary op operands types do not match: {0:?}",
bin
)))
}
}
_ => Ok(e),
}
}