From e0998847bee42134b0de48a82412503ca72a7fb9 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Tue, 14 Dec 2010 16:35:31 -0800 Subject: Teach fold about objs. --- src/comp/middle/fold.rs | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'src/comp') diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs index 5a03bc88..90f6bed3 100644 --- a/src/comp/middle/fold.rs +++ b/src/comp/middle/fold.rs @@ -191,6 +191,11 @@ type ast_fold[ENV] = vec[ast.ty_param] ty_params, def_id id) -> @item) fold_item_tag, + (fn(&ENV e, &span sp, ident ident, + &ast._obj ob, + vec[ast.ty_param] ty_params, + def_id id, ann a) -> @item) fold_item_obj, + // Additional nodes. (fn(&ENV e, &span sp, &ast.block_) -> block) fold_block, @@ -204,6 +209,10 @@ type ast_fold[ENV] = (fn(&ENV e, &span sp, &ast._mod m) -> @ast.crate) fold_crate, + (fn(&ENV e, + vec[ast.obj_field] fields, + vec[@ast.method] methods) -> ast._obj) fold_obj, + // Env updates. (fn(&ENV e, @ast.crate c) -> ENV) update_env_for_crate, (fn(&ENV e, @item i) -> ENV) update_env_for_item, @@ -596,6 +605,34 @@ fn fold_fn[ENV](&ENV env, ast_fold[ENV] fld, &ast._fn f) -> ast._fn { ret fld.fold_fn(env, f.effect, inputs, output, body); } + +fn fold_obj_field[ENV](&ENV env, ast_fold[ENV] fld, + &ast.obj_field f) -> ast.obj_field { + auto ty = fold_ty(env, fld, f.ty); + ret rec(ty=ty with f); +} + + +fn fold_method[ENV](&ENV env, ast_fold[ENV] fld, + @ast.method m) -> @ast.method { + auto meth = fold_fn(env, fld, m.node.meth); + ret @rec(node=rec(meth=meth with m.node) with *m); +} + + +fn fold_obj[ENV](&ENV env, ast_fold[ENV] fld, &ast._obj ob) -> ast._obj { + + let vec[ast.obj_field] fields = vec(); + let vec[@ast.method] meths = vec(); + for (ast.obj_field f in ob.fields) { + fields += fold_obj_field(env, fld, f); + } + for (@ast.method m in ob.methods) { + append[@ast.method](meths, fold_method(env, fld, m)); + } + ret fld.fold_obj(env, fields, meths); +} + fn fold_item[ENV](&ENV env, ast_fold[ENV] fld, @item i) -> @item { let ENV env_ = fld.update_env_for_item(env, i); @@ -641,6 +678,12 @@ fn fold_item[ENV](&ENV env, ast_fold[ENV] fld, @item i) -> @item { ret fld.fold_item_tag(env_, i.span, ident, new_variants, ty_params, id); } + + case (ast.item_obj(?ident, ?ob, ?tps, ?id, ?ann)) { + let ast._obj ob_ = fold_obj[ENV](env_, fld, ob); + ret fld.fold_item_obj(env_, i.span, ident, ob_, tps, id, ann); + } + } fail; @@ -926,6 +969,12 @@ fn identity_fold_item_tag[ENV](&ENV e, &span sp, ident i, ret @respan(sp, ast.item_tag(i, variants, ty_params, id)); } +fn identity_fold_item_obj[ENV](&ENV e, &span sp, ident i, + &ast._obj ob, vec[ast.ty_param] ty_params, + def_id id, ann a) -> @item { + ret @respan(sp, ast.item_obj(i, ob, ty_params, id, a)); +} + // Additional identities. @@ -949,6 +998,12 @@ fn identity_fold_crate[ENV](&ENV e, &span sp, &ast._mod m) -> @ast.crate { ret @respan(sp, rec(module=m)); } +fn identity_fold_obj[ENV](&ENV e, + vec[ast.obj_field] fields, + vec[@ast.method] methods) -> ast._obj { + ret rec(fields=fields, methods=methods); +} + // Env update identities. @@ -1056,11 +1111,13 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] { fold_item_mod = bind identity_fold_item_mod[ENV](_,_,_,_,_), fold_item_ty = bind identity_fold_item_ty[ENV](_,_,_,_,_,_,_), fold_item_tag = bind identity_fold_item_tag[ENV](_,_,_,_,_,_), + fold_item_obj = bind identity_fold_item_obj[ENV](_,_,_,_,_,_,_), fold_block = bind identity_fold_block[ENV](_,_,_), fold_fn = bind identity_fold_fn[ENV](_,_,_,_,_), fold_mod = bind identity_fold_mod[ENV](_,_), fold_crate = bind identity_fold_crate[ENV](_,_,_), + fold_obj = bind identity_fold_obj[ENV](_,_,_), update_env_for_crate = bind identity_update_env_for_crate[ENV](_,_), update_env_for_item = bind identity_update_env_for_item[ENV](_,_), -- cgit v1.2.3