@@ -20,6 +20,7 @@ import front.ast.block;
20
20
import front. ast . item ;
21
21
import front. ast . view_item ;
22
22
import front. ast . meta_item ;
23
+ import front. ast . native_item ;
23
24
import front. ast . arg ;
24
25
import front. ast . pat ;
25
26
import front. ast . decl ;
@@ -203,6 +204,9 @@ type ast_fold[ENV] =
203
204
@ty t, vec[ ast. ty_param ] ty_params,
204
205
def_id id, ann a) -> @item) fold_item_ty,
205
206
207
+ ( fn ( & ENV e, & span sp, ident ident,
208
+ def_id id) -> @native_item) fold_native_item_ty,
209
+
206
210
( fn ( & ENV e, & span sp, ident ident,
207
211
vec[ ast. variant ] variants,
208
212
vec[ ast. ty_param ] ty_params,
@@ -244,6 +248,7 @@ type ast_fold[ENV] =
244
248
// Env updates.
245
249
( fn ( & ENV e, @ast. crate c) -> ENV ) update_env_for_crate,
246
250
( fn ( & ENV e, @item i) -> ENV ) update_env_for_item,
251
+ ( fn ( & ENV e, @native_item i) -> ENV ) update_env_for_native_item,
247
252
( fn ( & ENV e, @view_item i) -> ENV ) update_env_for_view_item,
248
253
( fn ( & ENV e, & block b) -> ENV ) update_env_for_block,
249
254
( fn ( & ENV e, @stmt s) -> ENV ) update_env_for_stmt,
@@ -841,9 +846,34 @@ fn fold_mod[ENV](&ENV e, ast_fold[ENV] fld, &ast._mod m) -> ast._mod {
841
846
ret fld. fold_mod ( e, rec ( view_items=view_items, items=items, index=index) ) ;
842
847
}
843
848
849
+ fn fold_native_item[ ENV ] ( & ENV env, ast_fold[ ENV ] fld,
850
+ @native_item i) -> @native_item {
851
+ let ENV env_ = fld. update_env_for_native_item ( env, i) ;
852
+
853
+ if ( !fld. keep_going ( env_) ) {
854
+ ret i;
855
+ }
856
+ alt ( i. node ) {
857
+ case ( ast. native_item_ty ( ?ident, ?id) ) {
858
+ ret fld. fold_native_item_ty ( env_, i. span , ident, id) ;
859
+ }
860
+ }
861
+ }
862
+
844
863
fn fold_native_mod[ ENV ] ( & ENV e, ast_fold[ ENV ] fld,
845
864
& ast. native_mod m) -> ast. native_mod {
846
- ret fld. fold_native_mod ( e, rec ( native_name = m. native_name ) ) ;
865
+ let vec[ @native_item] items = vec ( ) ;
866
+ auto index = new_str_hash[ @ast. native_item ] ( ) ;
867
+
868
+ for ( @native_item i in m. items) {
869
+ auto new_item = fold_native_item[ ENV ] ( e, fld, i) ;
870
+ append[ @native_item] ( items, new_item) ;
871
+ ast. index_native_item( index, new_item) ;
872
+ }
873
+
874
+ ret fld. fold_native_mod( e, rec( native_name=m. native_name,
875
+ items=items,
876
+ index=index) ) ;
847
877
}
848
878
849
879
fn fold_crate[ ENV ] ( & ENV env, ast_fold[ ENV ] fld, @ast. crate c) -> @ast. crate {
@@ -1130,6 +1160,11 @@ fn identity_fold_item_ty[ENV](&ENV e, &span sp, ident i,
1130
1160
ret @respan( sp, ast. item_ty( i, t, ty_params, id, a) ) ;
1131
1161
}
1132
1162
1163
+ fn identity_fold_native_item_ty[ ENV ] ( & ENV e, & span sp, ident i,
1164
+ def_id id) -> @native_item {
1165
+ ret @respan( sp, ast. native_item_ty( i, id) ) ;
1166
+ }
1167
+
1133
1168
fn identity_fold_item_tag[ ENV ] ( & ENV e, & span sp, ident i,
1134
1169
vec[ ast. variant] variants,
1135
1170
vec[ ast. ty_param] ty_params,
@@ -1204,6 +1239,10 @@ fn identity_update_env_for_item[ENV](&ENV e, @item i) -> ENV {
1204
1239
ret e;
1205
1240
}
1206
1241
1242
+ fn identity_update_env_for_native_item[ ENV ] ( & ENV e, @native_item i) -> ENV {
1243
+ ret e;
1244
+ }
1245
+
1207
1246
fn identity_update_env_for_view_item[ ENV ] ( & ENV e, @view_item i) -> ENV {
1208
1247
ret e;
1209
1248
}
@@ -1308,6 +1347,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
1308
1347
fold_item_native_mod =
1309
1348
bind identity_fold_item_native_mod[ ENV ] ( _, _, _, _, _) ,
1310
1349
fold_item_ty = bind identity_fold_item_ty[ ENV ] ( _, _, _, _, _, _, _) ,
1350
+ fold_native_item_ty =
1351
+ bind identity_fold_native_item_ty[ ENV ] ( _, _, _, _) ,
1311
1352
fold_item_tag = bind identity_fold_item_tag[ ENV ] ( _, _, _, _, _, _) ,
1312
1353
fold_item_obj = bind identity_fold_item_obj[ ENV ] ( _, _, _, _, _, _, _) ,
1313
1354
@@ -1325,6 +1366,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
1325
1366
1326
1367
update_env_for_crate = bind identity_update_env_for_crate[ ENV ] ( _, _) ,
1327
1368
update_env_for_item = bind identity_update_env_for_item[ ENV ] ( _, _) ,
1369
+ update_env_for_native_item =
1370
+ bind identity_update_env_for_native_item[ ENV ] ( _, _) ,
1328
1371
update_env_for_view_item =
1329
1372
bind identity_update_env_for_view_item[ ENV ] ( _, _) ,
1330
1373
update_env_for_block = bind identity_update_env_for_block[ ENV ] ( _, _) ,
0 commit comments