diff options
| author | Brian Anderson <[email protected]> | 2011-03-10 22:58:55 -0500 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-03-14 16:41:46 -0700 |
| commit | 7464237256990c4a346cbaaa7ce3d2d9e8fe8d5c (patch) | |
| tree | a15721e61a7ba9fa223bed4ff0cb2a17cb8640f5 /src/comp/middle/ty.rs | |
| parent | Fold ty_chan and ty_port (diff) | |
| download | rust-7464237256990c4a346cbaaa7ce3d2d9e8fe8d5c.tar.xz rust-7464237256990c4a346cbaaa7ce3d2d9e8fe8d5c.zip | |
Add folding and type checking for ports and chans
Diffstat (limited to 'src/comp/middle/ty.rs')
| -rw-r--r-- | src/comp/middle/ty.rs | 54 |
1 files changed, 54 insertions, 0 deletions
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)) { |