@@ -209,6 +209,10 @@ type ast_fold[ENV] =
209
209
( fn ( & ENV e, & span sp,
210
210
& @expr e, & ann a) -> @expr) fold_expr_chan,
211
211
212
+ ( fn ( & ENV e, & span sp,
213
+ & ast. anon_obj ob, // TODO: Is the ob arg supposed to be & or not?
214
+ vec[ ast. ty_param ] tps,
215
+ ast. obj_def_ids odid, ann a) -> @expr) fold_expr_anon_obj,
212
216
213
217
// Decl folds.
214
218
( fn ( & ENV e, & span sp,
@@ -322,6 +326,11 @@ type ast_fold[ENV] =
322
326
& option:: t[ @ast:: method] dtor)
323
327
-> ast:: _obj) fold_obj,
324
328
329
+ ( fn ( & ENV e,
330
+ Option . t [ vec[ ast. obj_field ] ] fields,
331
+ vec[ @ast. method ] methods,
332
+ Option . t [ ident] with_obj) -> ast. anon_obj ) fold_anon_obj,
333
+
325
334
// Env updates.
326
335
( fn ( & ENV e, & @ast:: crate c) -> ENV ) update_env_for_crate,
327
336
( fn ( & ENV e, & @item i) -> ENV ) update_env_for_item,
@@ -828,6 +837,12 @@ fn fold_expr[ENV](&ENV env, &ast_fold[ENV] fld, &@expr e) -> @expr {
828
837
auto t2 = fld. fold_ann( env_, t) ;
829
838
ret fld. fold_expr_chan( env_, e. span, ee, t2) ;
830
839
}
840
+
841
+ case ( ast. expr_anon_obj( ?ob, ?tps, ?odid, ?t) ) {
842
+ auto ee = fold_anon_obj( env_, fld, ob) ;
843
+ auto t2 = fld. fold_ann( env_, t) ;
844
+ ret fld. fold_expr_anon_obj( env_, e. span, ee, tps, odid, t2) ;
845
+ }
831
846
}
832
847
833
848
fail;
@@ -930,7 +945,6 @@ fn fold_method[ENV](&ENV env, &ast_fold[ENV] fld,
930
945
ret @rec( node=rec( meth=meth with m. node) with * m) ;
931
946
}
932
947
933
-
934
948
fn fold_obj[ ENV ] ( & ENV env, & ast_fold[ ENV ] fld, & ast:: _obj ob) -> ast:: _obj {
935
949
936
950
let vec[ ast:: obj_field] fields = vec( ) ;
@@ -962,6 +976,49 @@ fn fold_obj[ENV](&ENV env, &ast_fold[ENV] fld, &ast::_obj ob) -> ast::_obj {
962
976
ret fld. fold_obj( env, fields, meths, dtor) ;
963
977
}
964
978
979
+ fn fold_anon_obj[ ENV ] ( & ENV env, ast_fold[ ENV ] fld, & ast. anon_obj ob)
980
+ -> ast. anon_obj {
981
+
982
+ // Fields
983
+ let Option . t[ vec[ ast. obj_field] ] fields = none[ vec[ ast. obj_field] ] ;
984
+ alt ( ob. fields) {
985
+ case ( none[ vec[ ast. obj_field] ] ) { }
986
+ case ( some[ vec[ ast. obj_field] ] ( ?v) ) {
987
+ let vec[ ast. obj_field] fields = vec( ) ;
988
+ for ( ast. obj_field f in v) {
989
+ fields += vec( fold_obj_field( env, fld, f) ) ;
990
+ }
991
+ }
992
+ }
993
+
994
+ // with_obj
995
+ let Option . t[ ast. ident] with_obj = none[ ast. ident] ;
996
+ alt ( ob. with_obj) {
997
+ case ( none[ ast. ident] ) { }
998
+ case ( some[ ast. ident] ( ?i) ) {
999
+ with_obj = some[ ast. ident] ( i) ;
1000
+ }
1001
+ }
1002
+
1003
+ // Methods
1004
+ let vec[ @ast. method] meths = vec( ) ;
1005
+ let vec[ ast. ty_param] tp = vec( ) ;
1006
+ for ( @ast. method m in ob. methods) {
1007
+ // Fake-up an ast.item for this method.
1008
+ // FIXME: this is kinda awful. Maybe we should reformulate
1009
+ // the way we store methods in the AST?
1010
+ let @ast. item i = @rec( node=ast. item_fn( m. node. ident,
1011
+ m. node. meth,
1012
+ tp,
1013
+ m. node. id,
1014
+ m. node. ann) ,
1015
+ span=m. span) ;
1016
+ let ENV _env = fld. update_env_for_item( env, i) ;
1017
+ Vec . push[ @ast. method] ( meths, fold_method( _env, fld, m) ) ;
1018
+ }
1019
+ ret fld. fold_anon_obj( env, fields, meths, with_obj) ;
1020
+ }
1021
+
965
1022
fn fold_view_item[ ENV ] ( & ENV env, & ast_fold[ ENV ] fld, & @view_item vi)
966
1023
-> @view_item {
967
1024
@@ -1410,6 +1467,12 @@ fn identity_fold_expr_chan[ENV](&ENV e, &span sp, &@expr x,
1410
1467
ret @respan( sp, ast:: expr_chan( x, a) ) ;
1411
1468
}
1412
1469
1470
+ fn identity_fold_expr_anon_obj[ ENV ] ( & ENV e, & span sp,
1471
+ & ast. anon_obj ob, vec[ ast. ty_param] tps,
1472
+ ast. obj_def_ids odid, ann a) -> @expr {
1473
+ ret @respan( sp, ast. expr_anon_obj( ob, tps, odid, a) ) ;
1474
+ }
1475
+
1413
1476
// Decl identities.
1414
1477
1415
1478
fn identity_fold_decl_local[ ENV ] ( & ENV e, & span sp,
@@ -1584,6 +1647,12 @@ fn identity_fold_obj[ENV](&ENV e,
1584
1647
ret rec( fields=fields, methods=methods, dtor=dtor) ;
1585
1648
}
1586
1649
1650
+ fn identity_fold_anon_obj[ ENV ] ( & ENV e,
1651
+ Option . t[ vec[ ast. obj_field] ] fields,
1652
+ vec[ @ast. method] methods,
1653
+ Option . t[ ident] with_obj) -> ast. anon_obj {
1654
+ ret rec( fields=fields, methods=methods, with_obj=with_obj) ;
1655
+ }
1587
1656
1588
1657
// Env update identities.
1589
1658
@@ -1707,6 +1776,9 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
1707
1776
fold_expr_port = bind identity_fold_expr_port[ ENV ] ( _, _, _) ,
1708
1777
fold_expr_chan = bind identity_fold_expr_chan[ ENV ] ( _, _, _, _) ,
1709
1778
1779
+ fold_expr_anon_obj
1780
+ = bind identity_fold_expr_anon_obj[ ENV ] ( _, _, _, _, _, _) ,
1781
+
1710
1782
fold_decl_local = bind identity_fold_decl_local[ ENV ] ( _, _, _) ,
1711
1783
fold_decl_item = bind identity_fold_decl_item[ ENV ] ( _, _, _) ,
1712
1784
@@ -1746,6 +1818,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
1746
1818
fold_native_mod = bind identity_fold_native_mod[ ENV ] ( _, _) ,
1747
1819
fold_crate = bind identity_fold_crate[ ENV ] ( _, _, _, _) ,
1748
1820
fold_obj = bind identity_fold_obj[ ENV ] ( _, _, _, _) ,
1821
+ fold_anon_obj = bind identity_fold_anon_obj[ ENV ] ( _, _, _, _) ,
1749
1822
1750
1823
update_env_for_crate = bind identity_update_env_for_crate[ ENV ] ( _, _) ,
1751
1824
update_env_for_item = bind identity_update_env_for_item[ ENV ] ( _, _) ,
0 commit comments