@@ -19,6 +19,8 @@ import front.ast.expr;
19
19
import front. ast . stmt ;
20
20
import front. ast . block ;
21
21
import front. ast . item ;
22
+ import front. ast . view_item ;
23
+ import front. ast . meta_item ;
22
24
import front. ast . arg ;
23
25
import front. ast . pat ;
24
26
import front. ast . decl ;
@@ -203,6 +205,14 @@ type ast_fold[ENV] =
203
205
vec[ ast. ty_param ] ty_params,
204
206
def_id id, ann a) -> @item) fold_item_obj,
205
207
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
+
206
216
// Additional nodes.
207
217
( fn ( & ENV e, & span sp,
208
218
& ast. block_ ) -> block) fold_block,
@@ -223,6 +233,7 @@ type ast_fold[ENV] =
223
233
// Env updates.
224
234
( fn ( & ENV e, @ast. crate c) -> ENV ) update_env_for_crate,
225
235
( fn ( & ENV e, @item i) -> ENV ) update_env_for_item,
236
+ ( fn ( & ENV e, @view_item i) -> ENV ) update_env_for_view_item,
226
237
( fn ( & ENV e, & block b) -> ENV ) update_env_for_block,
227
238
( fn ( & ENV e, @stmt s) -> ENV ) update_env_for_stmt,
228
239
( 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 {
683
694
ret fld. fold_obj ( env, fields, meths) ;
684
695
}
685
696
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
+
686
721
fn fold_item[ ENV ] ( & ENV env, ast_fold[ ENV ] fld, @item i) -> @item {
687
722
688
723
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 {
742
777
743
778
fn fold_mod[ ENV ] ( & ENV e, ast_fold[ ENV ] fld, & ast. _mod m) -> ast. _mod {
744
779
780
+ let vec[ @view_item] view_items = vec( ) ;
745
781
let vec[ @item] items = vec( ) ;
782
+ auto index = m. index;
746
783
747
784
for ( @item i in m. items ) {
748
785
append[ @item] ( items, fold_item[ ENV ] ( e, fld, i) ) ;
749
786
}
750
787
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) ) ;
752
793
}
753
794
754
795
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,
1036
1077
ret @respan ( sp, ast. item_obj ( i, ob, ty_params, id, a) ) ;
1037
1078
}
1038
1079
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
+ }
1039
1092
1040
1093
// Additional identities.
1041
1094
@@ -1076,6 +1129,10 @@ fn identity_update_env_for_item[ENV](&ENV e, @item i) -> ENV {
1076
1129
ret e;
1077
1130
}
1078
1131
1132
+ fn identity_update_env_for_view_item[ ENV ] ( & ENV e, @view_item i) -> ENV {
1133
+ ret e;
1134
+ }
1135
+
1079
1136
fn identity_update_env_for_block[ ENV ] ( & ENV e, & block b) -> ENV {
1080
1137
ret e;
1081
1138
}
@@ -1176,6 +1233,11 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
1176
1233
fold_item_tag = bind identity_fold_item_tag[ ENV ] ( _, _, _, _, _, _) ,
1177
1234
fold_item_obj = bind identity_fold_item_obj[ ENV ] ( _, _, _, _, _, _, _) ,
1178
1235
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
+
1179
1241
fold_block = bind identity_fold_block[ ENV ] ( _, _, _) ,
1180
1242
fold_fn = bind identity_fold_fn[ ENV ] ( _, _, _, _, _) ,
1181
1243
fold_mod = bind identity_fold_mod[ ENV ] ( _, _) ,
@@ -1184,6 +1246,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
1184
1246
1185
1247
update_env_for_crate = bind identity_update_env_for_crate[ ENV ] ( _, _) ,
1186
1248
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 ] ( _, _) ,
1187
1251
update_env_for_block = bind identity_update_env_for_block[ ENV ] ( _, _) ,
1188
1252
update_env_for_stmt = bind identity_update_env_for_stmt[ ENV ] ( _, _) ,
1189
1253
update_env_for_decl = bind identity_update_env_for_decl[ ENV ] ( _, _) ,
0 commit comments