From b1ef87bc10b662d6e37f929fa86db7a20b44e7dd Mon Sep 17 00:00:00 2001 From: David Li Date: Mon, 6 Nov 2017 20:49:04 -0500 Subject: Typecheck function declarations --- src/semantic/translate.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/semantic/translate.rs b/src/semantic/translate.rs index 7e0d2b8..617c832 100644 --- a/src/semantic/translate.rs +++ b/src/semantic/translate.rs @@ -64,8 +64,30 @@ fn trans_decl<'a>( tenv: &mut TypeEnvironment<'a>, decl: &WithLocation) -> Result { match decl.declaration { - ast::DeclarationBody::Fun { .. } => { - err!(decl, TypeError::Unimplemented) + ast::DeclarationBody::Fun { ref ty, ref params, ref body } => { + let declared_ty = if let &Some(ref ty) = ty { + Some(ast::WithLocation::new(trans_ty(venv, tenv, &ty)?, ty.start, ty.end)) + } else { None }; + + let mut new_venv = TypeEnvironment::new(Some(venv)); + let mut new_tenv = TypeEnvironment::new(Some(tenv)); + for param in params.iter() { + let decl_ty = trans_ty(&mut new_venv, &mut new_tenv, ¶m.ty)?; + new_venv.add_binding(param.name.value.clone(), decl_ty); + } + + let body_ty = trans_exp(&mut new_venv, &mut new_tenv, &*body)?; + + if let Some(decl_ty) = declared_ty { + if &decl_ty.value != &body_ty { + return err!(decl_ty, TypeError::Mismatch { + expected: decl_ty.value, + actual: body_ty, + }); + } + } + + Ok(body_ty) } ast::DeclarationBody::Ty { ref ty } => { trans_ty(venv, tenv, ty) -- cgit v1.2.3