Skip to content

Commit fb8eff9

Browse files
committed
Add the boilerplate for folding view items.
1 parent 62c79fb commit fb8eff9

File tree

1 file changed

+65
-1
lines changed

1 file changed

+65
-1
lines changed

src/comp/middle/fold.rs

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import front.ast.expr;
1919
import front.ast.stmt;
2020
import front.ast.block;
2121
import front.ast.item;
22+
import front.ast.view_item;
23+
import front.ast.meta_item;
2224
import front.ast.arg;
2325
import front.ast.pat;
2426
import front.ast.decl;
@@ -203,6 +205,14 @@ type ast_fold[ENV] =
203205
vec[ast.ty_param] ty_params,
204206
def_id id, ann a) -> @item) fold_item_obj,
205207

208+
// View Item folds.
209+
(fn(&ENV e, &span sp, ident ident,
210+
vec[@meta_item] meta_items,
211+
def_id id) -> @view_item) fold_view_item_use,
212+
213+
(fn(&ENV e, &span sp, vec[ident] idents,
214+
def_id id) -> @view_item) fold_view_item_import,
215+
206216
// Additional nodes.
207217
(fn(&ENV e, &span sp,
208218
&ast.block_) -> block) fold_block,
@@ -223,6 +233,7 @@ type ast_fold[ENV] =
223233
// Env updates.
224234
(fn(&ENV e, @ast.crate c) -> ENV) update_env_for_crate,
225235
(fn(&ENV e, @item i) -> ENV) update_env_for_item,
236+
(fn(&ENV e, @view_item i) -> ENV) update_env_for_view_item,
226237
(fn(&ENV e, &block b) -> ENV) update_env_for_block,
227238
(fn(&ENV e, @stmt s) -> ENV) update_env_for_stmt,
228239
(fn(&ENV e, @decl i) -> ENV) update_env_for_decl,
@@ -683,6 +694,30 @@ fn fold_obj[ENV](&ENV env, ast_fold[ENV] fld, &ast._obj ob) -> ast._obj {
683694
ret fld.fold_obj(env, fields, meths);
684695
}
685696

697+
fn fold_view_item[ENV](&ENV env, ast_fold[ENV] fld, @view_item vi)
698+
-> @view_item {
699+
700+
let ENV env_ = fld.update_env_for_view_item(env, vi);
701+
702+
if (!fld.keep_going(env_)) {
703+
ret vi;
704+
}
705+
706+
alt (vi.node) {
707+
case (ast.view_item_use(?ident, ?meta_items, ?def_id)) {
708+
// FIXME: what other folding should be done in here?
709+
ret fld.fold_view_item_use(env_, vi.span, ident, meta_items,
710+
def_id);
711+
}
712+
case (ast.view_item_import(?idents, ?def_id)) {
713+
// FIXME: what other folding should be done in here?
714+
ret fld.fold_view_item_import(env_, vi.span, idents, def_id);
715+
}
716+
}
717+
718+
fail;
719+
}
720+
686721
fn fold_item[ENV](&ENV env, ast_fold[ENV] fld, @item i) -> @item {
687722

688723
let ENV env_ = fld.update_env_for_item(env, i);
@@ -742,13 +777,19 @@ fn fold_item[ENV](&ENV env, ast_fold[ENV] fld, @item i) -> @item {
742777

743778
fn fold_mod[ENV](&ENV e, ast_fold[ENV] fld, &ast._mod m) -> ast._mod {
744779

780+
let vec[@view_item] view_items = vec();
745781
let vec[@item] items = vec();
782+
auto index = m.index;
746783

747784
for (@item i in m.items) {
748785
append[@item](items, fold_item[ENV](e, fld, i));
749786
}
750787

751-
ret fld.fold_mod(e, rec(items=items with m));
788+
for (@view_item vi in m.view_items) {
789+
append[@view_item](view_items, fold_view_item[ENV](e, fld, vi));
790+
}
791+
792+
ret fld.fold_mod(e, rec(view_items=view_items, items=items, index=index));
752793
}
753794

754795
fn fold_crate[ENV](&ENV env, ast_fold[ENV] fld, @ast.crate c) -> @ast.crate {
@@ -1036,6 +1077,18 @@ fn identity_fold_item_obj[ENV](&ENV e, &span sp, ident i,
10361077
ret @respan(sp, ast.item_obj(i, ob, ty_params, id, a));
10371078
}
10381079

1080+
// View Item folds.
1081+
1082+
fn identity_fold_view_item_use[ENV](&ENV e, &span sp, ident i,
1083+
vec[@meta_item] meta_items,
1084+
def_id id) -> @view_item {
1085+
ret @respan(sp, ast.view_item_use(i, meta_items, id));
1086+
}
1087+
1088+
fn identity_fold_view_item_import[ENV](&ENV e, &span sp, vec[ident] is,
1089+
def_id id) -> @view_item {
1090+
ret @respan(sp, ast.view_item_import(is, id));
1091+
}
10391092

10401093
// Additional identities.
10411094

@@ -1076,6 +1129,10 @@ fn identity_update_env_for_item[ENV](&ENV e, @item i) -> ENV {
10761129
ret e;
10771130
}
10781131

1132+
fn identity_update_env_for_view_item[ENV](&ENV e, @view_item i) -> ENV {
1133+
ret e;
1134+
}
1135+
10791136
fn identity_update_env_for_block[ENV](&ENV e, &block b) -> ENV {
10801137
ret e;
10811138
}
@@ -1176,6 +1233,11 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
11761233
fold_item_tag = bind identity_fold_item_tag[ENV](_,_,_,_,_,_),
11771234
fold_item_obj = bind identity_fold_item_obj[ENV](_,_,_,_,_,_,_),
11781235

1236+
fold_view_item_use =
1237+
bind identity_fold_view_item_use[ENV](_,_,_,_,_),
1238+
fold_view_item_import =
1239+
bind identity_fold_view_item_import[ENV](_,_,_,_),
1240+
11791241
fold_block = bind identity_fold_block[ENV](_,_,_),
11801242
fold_fn = bind identity_fold_fn[ENV](_,_,_,_,_),
11811243
fold_mod = bind identity_fold_mod[ENV](_,_),
@@ -1184,6 +1246,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
11841246

11851247
update_env_for_crate = bind identity_update_env_for_crate[ENV](_,_),
11861248
update_env_for_item = bind identity_update_env_for_item[ENV](_,_),
1249+
update_env_for_view_item =
1250+
bind identity_update_env_for_view_item[ENV](_,_),
11871251
update_env_for_block = bind identity_update_env_for_block[ENV](_,_),
11881252
update_env_for_stmt = bind identity_update_env_for_stmt[ENV](_,_),
11891253
update_env_for_decl = bind identity_update_env_for_decl[ENV](_,_),

0 commit comments

Comments
 (0)