From 7464237256990c4a346cbaaa7ce3d2d9e8fe8d5c Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 10 Mar 2011 22:58:55 -0500 Subject: Add folding and type checking for ports and chans --- src/comp/middle/ty.rs | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'src/comp/middle/ty.rs') diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index bd3e3263..73b519ba 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -38,6 +38,8 @@ tag sty { ty_tag(ast.def_id, vec[@t]); ty_box(@t); ty_vec(@t); + ty_port(@t); + ty_chan(@t); ty_tup(vec[@t]); ty_rec(vec[field]); ty_fn(ast.proto, vec[arg], @t); // TODO: effect @@ -240,6 +242,12 @@ fn fold_ty(ty_fold fld, @t ty) -> @t { case (ty_vec(?subty)) { ret rewrap(ty, ty_vec(fold_ty(fld, subty))); } + case (ty_port(?subty)) { + ret rewrap(ty, ty_port(fold_ty(fld, subty))); + } + case (ty_chan(?subty)) { + ret rewrap(ty, ty_chan(fold_ty(fld, subty))); + } case (ty_tag(?tid, ?subtys)) { let vec[@t] new_subtys = vec(); for (@t subty in subtys) { @@ -1159,6 +1167,52 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler) } } + case (ty.ty_port(?expected_sub)) { + alt (actual.struct) { + case (ty.ty_port(?actual_sub)) { + auto result = unify_step(bindings, + expected_sub, + actual_sub, + handler); + alt (result) { + case (ures_ok(?result_sub)) { + ret ures_ok(plain_ty(ty.ty_port(result_sub))); + } + case (_) { + ret result; + } + } + } + + case (_) { + ret ures_err(terr_mismatch, expected, actual); + } + } + } + + case (ty.ty_chan(?expected_sub)) { + alt (actual.struct) { + case (ty.ty_chan(?actual_sub)) { + auto result = unify_step(bindings, + expected_sub, + actual_sub, + handler); + alt (result) { + case (ures_ok(?result_sub)) { + ret ures_ok(plain_ty(ty.ty_chan(result_sub))); + } + case (_) { + ret result; + } + } + } + + case (_) { + ret ures_err(terr_mismatch, expected, actual); + } + } + } + case (ty.ty_tup(?expected_elems)) { alt (actual.struct) { case (ty.ty_tup(?actual_elems)) { -- cgit v1.2.3