From 6c4e975099f22d6438af0fb3e69f79c433156422 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Mon, 29 Nov 2010 16:09:46 -0800 Subject: [PATCH] Teach fold about ty_rec. --- src/comp/middle/fold.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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 @@ -48,6 +48,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](_,_,_),