From f0ed63ccf363906306714a3a75c61470a5748c50 Mon Sep 17 00:00:00 2001 From: greg Date: Tue, 19 Feb 2019 23:00:41 -0800 Subject: [PATCH] Basic if-statement checking --- schala-lang/language/src/typechecking.rs | 27 ++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) 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 {