From fb0f9f50160bd80dadbabc8fb3a4a2963e37a430 Mon Sep 17 00:00:00 2001 From: Garrit Franke Date: Sun, 7 Feb 2021 00:44:58 +0100 Subject: [PATCH] feat: infer array types --- src/parser/infer.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/parser/infer.rs b/src/parser/infer.rs index 62efaca..91fc16c 100644 --- a/src/parser/infer.rs +++ b/src/parser/infer.rs @@ -10,9 +10,7 @@ pub(super) fn infer(program: &mut Program) -> Result<(), String> { Statement::Declare(var, expr) => { if let None = &var.ty { if let Some(e) = expr { - dbg!(&var); var.ty = infer_expression(&e); - dbg!(&var); } } } @@ -29,6 +27,18 @@ fn infer_expression(expr: &Expression) -> Option { Expression::Int(_) => Some(Type::Int), Expression::Bool(_) => Some(Type::Bool), Expression::Str(_) => Some(Type::Str), + Expression::Array(els) => infer_array(els), _ => None, } } + +fn infer_array(elements: &Vec) -> Option { + let types: Vec> = elements.iter().map(|el| infer_expression(el)).collect(); + + // TODO: This approach only relies on the first element. + // It will not catch that types are possibly inconsistent. + match types.first().and_then(|ty| ty.to_owned()) { + Some(ty) => Some(Type::Array(Box::new(ty))), + None => None, + } +}