about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2010-11-29 16:09:46 -0800
committerGraydon Hoare <graydon@mozilla.com>2010-11-29 16:09:46 -0800
commit6c4e975099f22d6438af0fb3e69f79c433156422 (patch)
treeec2448c5acf0cd089d2633fac574ea2edbcb7f57 /src/comp
parente6b7f763853d0d847288111e7050841e05a885f4 (diff)
downloadrust-6c4e975099f22d6438af0fb3e69f79c433156422.tar.gz
rust-6c4e975099f22d6438af0fb3e69f79c433156422.zip
Teach fold about ty_rec.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/fold.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs
index f2fb11cbde8..ff8f5505bab 100644
--- a/src/comp/middle/fold.rs
+++ b/src/comp/middle/fold.rs
@@ -49,6 +49,9 @@ type ast_fold[ENV] =
      (fn(&ENV e, &span sp, vec[@ty] elts) -> @ty) fold_ty_tup,
 
      (fn(&ENV e, &span sp,
+         vec[tup(ident,@ty)] elts) -> @ty)        fold_ty_rec,
+
+     (fn(&ENV e, &span sp,
          vec[rec(ast.mode mode, @ty ty)] inputs,
          @ty output) -> @ty)                      fold_ty_fn,
 
@@ -252,6 +255,15 @@ fn fold_ty[ENV](&ENV env, ast_fold[ENV] fld, @ty t) -> @ty {
             ret fld.fold_ty_tup(env_, t.span, elts);
         }
 
+        case (ast.ty_rec(?elts)) {
+            let vec[tup(ident,@ty)] elts_ = vec();
+            for (tup(ident, @ty) elt in elts) {
+                append[tup(ident, @ty)]
+                    (elts_, tup(elt._0, fold_ty(env, fld, elt._1)));
+            }
+            ret fld.fold_ty_rec(env_, t.span, elts);
+        }
+
         case (ast.ty_path(?pth, ?ref_opt)) {
             let vec[ast.name] path = vec();
             for (ast.name n in pth) {
@@ -655,6 +667,11 @@ fn identity_fold_ty_tup[ENV](&ENV env, &span sp,
     ret @respan(sp, ast.ty_tup(elts));
 }
 
+fn identity_fold_ty_rec[ENV](&ENV env, &span sp,
+                             vec[tup(ident,@ty)] elts) -> @ty {
+    ret @respan(sp, ast.ty_rec(elts));
+}
+
 fn identity_fold_ty_fn[ENV](&ENV env, &span sp,
                             vec[rec(ast.mode mode, @ty ty)] inputs,
                             @ty output) -> @ty {
@@ -918,6 +935,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
          fold_ty_box     = bind identity_fold_ty_box[ENV](_,_,_),
          fold_ty_vec     = bind identity_fold_ty_vec[ENV](_,_,_),
          fold_ty_tup     = bind identity_fold_ty_tup[ENV](_,_,_),
+         fold_ty_rec     = bind identity_fold_ty_rec[ENV](_,_,_),
          fold_ty_fn      = bind identity_fold_ty_fn[ENV](_,_,_,_),
          fold_ty_path    = bind identity_fold_ty_path[ENV](_,_,_,_),
          fold_ty_mutable = bind identity_fold_ty_mutable[ENV](_,_,_),