Skip to content

Commit 3604f36

Browse files
committed
Implement folding of ast::ty.
1 parent 42e25b2 commit 3604f36

File tree

1 file changed

+30
-3
lines changed

1 file changed

+30
-3
lines changed

src/comp/syntax/fold.rs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -415,9 +415,36 @@ fn noop_fold_expr(e: expr_, fld: ast_fold) -> expr_ {
415415
}
416416
}
417417

418-
fn noop_fold_ty(t: ty_, _fld: ast_fold) -> ty_ {
419-
//drop in ty::fold_ty here if necessary
420-
ret t;
418+
fn noop_fold_ty(t: ty_, fld: ast_fold) -> ty_ {
419+
let fold_mac = bind fold_mac_(_, fld);
420+
fn fold_mt(mt: mt, fld: ast_fold) -> mt {
421+
{ty: fld.fold_ty(mt.ty), mut: mt.mut}
422+
}
423+
fn fold_field(f: ty_field, fld: ast_fold) -> ty_field {
424+
{node: {ident: fld.fold_ident(f.node.ident),
425+
mt: fold_mt(f.node.mt, fld)},
426+
span: fld.new_span(f.span)}
427+
}
428+
alt t {
429+
ty_nil | ty_bot | ty_bool | ty_str {t}
430+
ty_int(_) | ty_uint(_) | ty_float(_) {t}
431+
ty_box(mt) {ty_box(fold_mt(mt, fld))}
432+
ty_uniq(mt) {ty_uniq(fold_mt(mt, fld))}
433+
ty_vec(mt) {ty_vec(fold_mt(mt, fld))}
434+
ty_ptr(mt) {ty_ptr(fold_mt(mt, fld))}
435+
ty_task {t}
436+
ty_port(ty) {ty_port(fld.fold_ty(ty))}
437+
ty_chan(ty) {ty_chan(fld.fold_ty(ty))}
438+
ty_rec(fields) {ty_rec(vec::map(fields) {|f| fold_field(f, fld)})}
439+
ty_fn(proto, decl) {ty_fn(proto, fold_fn_decl(decl, fld))}
440+
ty_tup(tys) {ty_tup(vec::map(tys) {|ty| fld.fold_ty(ty)})}
441+
ty_path(path, id) {ty_path(fld.fold_path(path), fld.new_id(id))}
442+
ty_type {t}
443+
// FIXME: constrs likely needs to be folded...
444+
ty_constr(ty, constrs) {ty_constr(fld.fold_ty(ty), constrs)}
445+
ty_mac(mac) {ty_mac(fold_mac(mac))}
446+
ty_infer {t}
447+
}
421448
}
422449

423450
fn noop_fold_constr(c: constr_, fld: ast_fold) -> constr_ {

0 commit comments

Comments
 (0)