aboutsummaryrefslogtreecommitdiff
path: root/src/comp/middle/ty.rs
diff options
context:
space:
mode:
authorBrian Anderson <[email protected]>2011-03-10 22:58:55 -0500
committerGraydon Hoare <[email protected]>2011-03-14 16:41:46 -0700
commit7464237256990c4a346cbaaa7ce3d2d9e8fe8d5c (patch)
treea15721e61a7ba9fa223bed4ff0cb2a17cb8640f5 /src/comp/middle/ty.rs
parentFold ty_chan and ty_port (diff)
downloadrust-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.rs54
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)) {