diff --git a/fine/src/semantics.rs b/fine/src/semantics.rs index 6f3fcff2..a3c893ef 100644 --- a/fine/src/semantics.rs +++ b/fine/src/semantics.rs @@ -653,6 +653,7 @@ impl<'a> Semantics<'a> { TreeKind::LetStatement => Some(Type::Nothing), TreeKind::ReturnStatement => Some(Type::Unreachable), TreeKind::ExpressionStatement => self.type_of_expression_statement(tree), + TreeKind::IfStatement => self.type_of_if_statement(tree), TreeKind::Identifier => self.type_of_identifier(t, tree), TreeKind::FunctionDecl => self.type_of_function_decl(tree), @@ -1020,6 +1021,10 @@ impl<'a> Semantics<'a> { Some(Type::Function(parameter_types, return_type)) } + fn type_of_if_statement(&self, tree: &Tree) -> Option { + Some(self.type_of(tree.nth_tree(0)?)) + } + pub fn dump_compiler_state(&self, tr: Option) { eprintln!("Parsed the tree as:"); eprintln!("\n{}", self.syntax_tree.dump(true)); diff --git a/fine/tests/expression/conditional.fine b/fine/tests/expression/conditional.fine index 9f948fe7..a7ed78fc 100644 --- a/fine/tests/expression/conditional.fine +++ b/fine/tests/expression/conditional.fine @@ -1,51 +1,59 @@ -if true { "discarded"; 23 } else { 45 } +fun test() { + if true { "discarded"; 23 } else { 45 } +} // @no-errors // Here come some type probes! // (type of the condition) -// @type: 3 bool +// @type: 20 bool // // (the discarded expression) -// @type: 10 string +// @type: 27 string // // (the "then" clause) -// @type: 23 f64 -// @type: 26 f64 +// @type: 40 f64 +// @type: 43 f64 // // (the "else" clause) -// @type: 35 f64 -// @type: 38 f64 -// -// (the overall expression) -// @type: 0 f64 +// @type: 52 f64 +// @type: 55 f64 // // @concrete: // | File -// | IfStatement -// | ConditionalExpression -// | If:'"if"' -// | LiteralExpression -// | True:'"true"' -// | Block -// | LeftBrace:'"{"' -// | ExpressionStatement +// | FunctionDecl +// | Fun:'"fun"' +// | Identifier:'"test"' +// | ParamList +// | LeftParen:'"("' +// | RightParen:'")"' +// | Block +// | LeftBrace:'"{"' +// | IfStatement +// | ConditionalExpression +// | If:'"if"' // | LiteralExpression -// | String:'"\"discarded\""' -// | Semicolon:'";"' -// | ExpressionStatement -// | LiteralExpression -// | Number:'"23"' -// | RightBrace:'"}"' -// | Else:'"else"' -// | Block -// | LeftBrace:'"{"' -// | ExpressionStatement -// | LiteralExpression -// | Number:'"45"' -// | RightBrace:'"}"' +// | True:'"true"' +// | Block +// | LeftBrace:'"{"' +// | ExpressionStatement +// | LiteralExpression +// | String:'"\"discarded\""' +// | Semicolon:'";"' +// | ExpressionStatement +// | LiteralExpression +// | Number:'"23"' +// | RightBrace:'"}"' +// | Else:'"else"' +// | Block +// | LeftBrace:'"{"' +// | ExpressionStatement +// | LiteralExpression +// | Number:'"45"' +// | RightBrace:'"}"' +// | RightBrace:'"}"' // // @compiles-to: -// | function << module >> (0 args, 0 locals): +// | function test (0 args, 0 locals): // | strings (1): // | 0: "discarded" // | code (8): @@ -57,4 +65,10 @@ if true { "discarded"; 23 } else { 45 } // | 5: Jump(7) // | 6: PushFloat(45.0) // | 7: Return +// | function << module >> (0 args, 0 locals): +// | strings (0): +// | code (2): +// | 0: PushNothing +// | 1: Return // | +// @eval: Float(23.0)