diff --git a/schala-lang/language/src/typechecking.rs b/schala-lang/language/src/typechecking.rs index 08803a8..a0a9666 100644 --- a/schala-lang/language/src/typechecking.rs +++ b/schala-lang/language/src/typechecking.rs @@ -260,9 +260,32 @@ impl<'a> TypeContext<'a> { } fn if_expr(&mut self, discriminator: &Discriminator, body: &IfExpressionBody) -> InferResult { - //only handle simple case for now + use self::Discriminator::*; use self::IfExpressionBody::*; + match (discriminator, body) { + (Simple(expr), SimpleConditional(then_clause, else_clause)) => self.handle_simple_if(expr, then_clause, else_clause), + _ => TypeError::new(&format!("Complex conditionals not supported")) + } + } - Ok(ty!(Unit)) + fn handle_simple_if(&mut self, expr: &Expression, then_clause: &Block, else_clause: &Option) -> InferResult { + let t1 = self.expr(expr)?; + let t2 = self.block(then_clause)?; + let t3 = match else_clause { + Some(block) => self.block(block)?, + None => ty!(Unit) + }; + + let _ = self.unify(ty!(Bool), t1)?; + self.unify(t2, t3) + } + + fn block(&mut self, block: &Block) -> InferResult { + let mut output = ty!(Unit); + for s in block.iter() { + let statement = s.node(); + output = self.statement(statement)?; + } + Ok(output) } fn handle_value(&mut self, val: &Rc) -> InferResult {