@@ -655,39 +655,31 @@ pure fn ty_name(cx: ctxt, typ: t) -> option::t<@str> {
655
655
}
656
656
}
657
657
658
-
659
- // Type folds
660
- type ty_walk = fn @( t ) ;
661
-
662
- fn walk_ty ( cx : ctxt , walker : ty_walk , ty : t ) {
658
+ fn walk_ty ( cx : ctxt , ty : t , f : fn ( t ) ) {
663
659
alt struct( cx, ty) {
664
660
ty_nil | ty_bot | ty_bool | ty_int ( _) | ty_uint ( _) | ty_float ( _) |
665
661
ty_str | ty_send_type | ty_type | ty_native ( _) |
666
- ty_opaque_closure_ptr ( _) {
667
- /* no-op */
668
- }
669
- ty_box ( tm) | ty_vec ( tm) | ty_ptr ( tm) { walk_ty ( cx, walker, tm. ty ) ; }
662
+ ty_opaque_closure_ptr ( _) | ty_var ( _) | ty_param ( _, _) { }
663
+ ty_box ( tm) | ty_vec ( tm) | ty_ptr ( tm) { walk_ty ( cx, tm. ty , f) ; }
670
664
ty_enum ( _, subtys) | ty_iface ( _, subtys) {
671
- for subty: t in subtys { walk_ty ( cx, walker , subty ) ; }
665
+ for subty: t in subtys { walk_ty ( cx, subty , f ) ; }
672
666
}
673
667
ty_rec ( fields) {
674
- for fl: field in fields { walk_ty ( cx, walker , fl. mt . ty ) ; }
668
+ for fl: field in fields { walk_ty ( cx, fl. mt . ty , f ) ; }
675
669
}
676
- ty_tup ( ts) { for tt in ts { walk_ty ( cx, walker , tt ) ; } }
677
- ty_fn ( f ) {
678
- for a: arg in f . inputs { walk_ty ( cx, walker , a. ty ) ; }
679
- walk_ty ( cx, walker , f. output ) ;
670
+ ty_tup ( ts) { for tt in ts { walk_ty ( cx, tt , f ) ; } }
671
+ ty_fn ( ft ) {
672
+ for a: arg in ft . inputs { walk_ty ( cx, a. ty , f ) ; }
673
+ walk_ty ( cx, ft . output , f) ;
680
674
}
681
675
ty_res ( _, sub, tps) {
682
- walk_ty ( cx, walker , sub ) ;
683
- for tp: t in tps { walk_ty ( cx, walker , tp ) ; }
676
+ walk_ty ( cx, sub , f ) ;
677
+ for tp: t in tps { walk_ty ( cx, tp , f ) ; }
684
678
}
685
- ty_constr ( sub, _) { walk_ty ( cx, walker, sub) ; }
686
- ty_var ( _) { /* no-op */ }
687
- ty_param ( _, _) { /* no-op */ }
688
- ty_uniq ( tm) { walk_ty ( cx, walker, tm. ty ) ; }
679
+ ty_constr ( sub, _) { walk_ty ( cx, sub, f) ; }
680
+ ty_uniq ( tm) { walk_ty ( cx, tm. ty , f) ; }
689
681
}
690
- walker ( ty) ;
682
+ f ( ty) ;
691
683
}
692
684
693
685
enum fold_mode {
@@ -1239,14 +1231,11 @@ fn type_param(cx: ctxt, ty: t) -> option::t<uint> {
1239
1231
// Returns a vec of all the type variables
1240
1232
// occurring in t. It may contain duplicates.
1241
1233
fn vars_in_type ( cx : ctxt , ty : t ) -> [ int ] {
1242
- fn collect_var ( cx : ctxt , vars : @mutable [ int ] , ty : t ) {
1243
- alt struct( cx, ty) { ty_var ( v) { * vars += [ v] ; } _ { } }
1234
+ let rslt = [ ] ;
1235
+ walk_ty ( cx, ty) { |ty|
1236
+ alt struct ( cx, ty) { ty_var ( v) { rslt += [ v] ; } _ { } }
1244
1237
}
1245
- let rslt: @mutable [ int ] = @mutable [ ] ;
1246
- walk_ty ( cx, bind collect_var ( cx, rslt, _) , ty) ;
1247
- // Works because of a "convenient" bug that lets us
1248
- // return a mutable vec as if it's immutable
1249
- ret * rslt;
1238
+ rslt
1250
1239
}
1251
1240
1252
1241
fn type_autoderef ( cx : ctxt , t : ty:: t ) -> ty:: t {
@@ -1450,22 +1439,18 @@ fn node_id_has_type_params(cx: ctxt, id: ast::node_id) -> bool {
1450
1439
1451
1440
// Returns the number of distinct type parameters in the given type.
1452
1441
fn count_ty_params ( cx : ctxt , ty : t ) -> uint {
1453
- fn counter ( cx : ctxt , param_indices : @mutable [ uint ] , ty : t ) {
1454
- alt struct( cx, ty) {
1442
+ let param_indices = [ ] ;
1443
+ walk_ty ( cx, ty) { |t|
1444
+ alt struct ( cx, t) {
1455
1445
ty_param ( param_idx, _) {
1456
- let seen = false ;
1457
- for other_param_idx: uint in * param_indices {
1458
- if param_idx == other_param_idx { seen = true ; }
1446
+ if !vec:: any ( param_indices, { |i| i == param_idx} ) {
1447
+ param_indices += [ param_idx] ;
1459
1448
}
1460
- if !seen { * param_indices += [ param_idx] ; }
1461
1449
}
1462
- _ { /* fall through */ }
1450
+ _ { }
1463
1451
}
1464
1452
}
1465
- let param_indices: @mutable [ uint ] = @mutable [ ] ;
1466
- let f = bind counter ( cx, param_indices, _) ;
1467
- walk_ty ( cx, f, ty) ;
1468
- ret vec:: len :: < uint > ( * param_indices) ;
1453
+ vec:: len ( param_indices)
1469
1454
}
1470
1455
1471
1456
fn type_contains_vars ( cx : ctxt , typ : t ) -> bool {
0 commit comments