@@ -566,12 +566,11 @@ fn expand_non_macro_stmt(exts: SyntaxEnv, s: &Stmt, fld: &MacroExpander)
566
566
// oh dear heaven... this is going to include the enum names, as well....
567
567
// ... but that should be okay, as long as the new names are gensyms
568
568
// for the old ones.
569
- let idents = @mut ~[ ] ;
570
- let name_finder = new_name_finder ( idents) ;
569
+ let mut name_finder = new_name_finder ( ~[ ] ) ;
571
570
name_finder. visit_pat ( expanded_pat, ( ) ) ;
572
571
// generate fresh names, push them to a new pending list
573
572
let new_pending_renames = @mut ~[ ] ;
574
- for ident in idents . iter ( ) {
573
+ for ident in name_finder . ident_accumulator . iter ( ) {
575
574
let new_name = fresh_name ( ident) ;
576
575
new_pending_renames. push ( ( * ident, new_name) ) ;
577
576
}
@@ -609,7 +608,7 @@ fn expand_non_macro_stmt(exts: SyntaxEnv, s: &Stmt, fld: &MacroExpander)
609
608
// array (passed in to the traversal)
610
609
#[ deriving( Clone ) ]
611
610
struct NewNameFinderContext {
612
- ident_accumulator : @ mut ~[ ast:: Ident ] ,
611
+ ident_accumulator : ~[ ast:: Ident ] ,
613
612
}
614
613
615
614
impl Visitor < ( ) > for NewNameFinderContext {
@@ -653,50 +652,13 @@ impl Visitor<()> for NewNameFinderContext {
653
652
654
653
}
655
654
656
- // a visitor that extracts the paths
657
- // from a given thingy and puts them in a mutable
658
- // array (passed in to the traversal)
659
- #[ deriving( Clone ) ]
660
- struct NewPathExprFinderContext {
661
- path_accumulator : @mut ~[ ast:: Path ] ,
662
- }
663
-
664
- impl Visitor < ( ) > for NewPathExprFinderContext {
665
-
666
- fn visit_expr ( & mut self , expr : @ast:: Expr , _: ( ) ) {
667
- match * expr {
668
- ast:: Expr { id : _, span : _, node : ast:: ExprPath ( ref p) } => {
669
- self . path_accumulator . push ( p. clone ( ) ) ;
670
- // not calling visit_path, should be fine.
671
- }
672
- _ => visit:: walk_expr ( self , expr, ( ) )
673
- }
674
- }
675
-
676
- fn visit_ty ( & mut self , typ : & ast:: Ty , _: ( ) ) {
677
- visit:: walk_ty ( self , typ, ( ) )
678
- }
679
-
680
- }
681
-
682
655
// return a visitor that extracts the pat_ident paths
683
656
// from a given thingy and puts them in a mutable
684
657
// array (passed in to the traversal)
685
- pub fn new_name_finder ( idents : @ mut ~[ ast:: Ident ] ) -> @ mut Visitor < ( ) > {
686
- let context = @ mut NewNameFinderContext {
658
+ pub fn new_name_finder ( idents : ~[ ast:: Ident ] ) -> NewNameFinderContext {
659
+ NewNameFinderContext {
687
660
ident_accumulator : idents,
688
- } ;
689
- context as @mut Visitor < ( ) >
690
- }
691
-
692
- // return a visitor that extracts the paths
693
- // from a given pattern and puts them in a mutable
694
- // array (passed in to the traversal)
695
- pub fn new_path_finder ( paths : @mut ~[ ast:: Path ] ) -> @mut Visitor < ( ) > {
696
- let context = @mut NewPathExprFinderContext {
697
- path_accumulator : paths,
698
- } ;
699
- context as @mut Visitor < ( ) >
661
+ }
700
662
}
701
663
702
664
// expand a block. pushes a new exts_frame, then calls expand_block_elts
@@ -1371,6 +1333,42 @@ mod test {
1371
1333
use util:: parser_testing:: { string_to_crate, string_to_crate_and_sess} ;
1372
1334
use util:: parser_testing:: { string_to_pat, string_to_tts, strs_to_idents} ;
1373
1335
use visit;
1336
+ use visit:: Visitor ;
1337
+
1338
+ // a visitor that extracts the paths
1339
+ // from a given thingy and puts them in a mutable
1340
+ // array (passed in to the traversal)
1341
+ #[ deriving( Clone ) ]
1342
+ struct NewPathExprFinderContext {
1343
+ path_accumulator : ~[ ast:: Path ] ,
1344
+ }
1345
+
1346
+ impl Visitor < ( ) > for NewPathExprFinderContext {
1347
+
1348
+ fn visit_expr ( & mut self , expr : @ast:: Expr , _: ( ) ) {
1349
+ match * expr {
1350
+ ast:: Expr { id : _, span : _, node : ast:: ExprPath ( ref p) } => {
1351
+ self . path_accumulator . push ( p. clone ( ) ) ;
1352
+ // not calling visit_path, should be fine.
1353
+ }
1354
+ _ => visit:: walk_expr ( self , expr, ( ) )
1355
+ }
1356
+ }
1357
+
1358
+ fn visit_ty ( & mut self , typ : & ast:: Ty , _: ( ) ) {
1359
+ visit:: walk_ty ( self , typ, ( ) )
1360
+ }
1361
+
1362
+ }
1363
+
1364
+ // return a visitor that extracts the paths
1365
+ // from a given pattern and puts them in a mutable
1366
+ // array (passed in to the traversal)
1367
+ pub fn new_path_finder ( paths : ~[ ast:: Path ] ) -> NewPathExprFinderContext {
1368
+ NewPathExprFinderContext {
1369
+ path_accumulator : paths
1370
+ }
1371
+ }
1374
1372
1375
1373
// make sure that fail! is present
1376
1374
#[ test] fn fail_exists_test ( ) {
@@ -1498,10 +1496,11 @@ mod test {
1498
1496
let renamer = new_rename_folder ( ast:: Ident { name : a_name, ctxt : EMPTY_CTXT } ,
1499
1497
a2_name) ;
1500
1498
let renamed_ast = renamer. fold_crate ( item_ast. clone ( ) ) ;
1501
- let varrefs = @mut ~[ ] ;
1502
- visit:: walk_crate ( & mut new_path_finder ( varrefs) , & renamed_ast, ( ) ) ;
1503
- match varrefs {
1504
- @[ ast:: Path { segments : [ ref seg] , _} ] =>
1499
+ let mut path_finder = new_path_finder ( ~[ ] ) ;
1500
+ visit:: walk_crate ( & mut path_finder, & renamed_ast, ( ) ) ;
1501
+
1502
+ match path_finder. path_accumulator {
1503
+ [ ast:: Path { segments : [ ref seg] , _} ] =>
1505
1504
assert_eq ! ( mtwt_resolve( seg. identifier) , a2_name) ,
1506
1505
_ => assert_eq ! ( 0 , 1 )
1507
1506
}
@@ -1513,10 +1512,10 @@ mod test {
1513
1512
let pending_renames = @mut ~[ ( ast:: Ident :: new ( a_name) , a2_name) ,
1514
1513
( ast:: Ident { name : a_name, ctxt : ctxt2} , a3_name) ] ;
1515
1514
let double_renamed = renames_to_fold ( pending_renames) . fold_crate ( item_ast) ;
1516
- let varrefs = @ mut ~[ ] ;
1517
- visit:: walk_crate ( & mut new_path_finder ( varrefs ) , & double_renamed, ( ) ) ;
1518
- match varrefs {
1519
- @ [ ast:: Path { segments : [ ref seg] , _} ] =>
1515
+ let mut path_finder = new_path_finder ( ~[ ] ) ;
1516
+ visit:: walk_crate ( & mut path_finder , & double_renamed, ( ) ) ;
1517
+ match path_finder . path_accumulator {
1518
+ [ ast:: Path { segments : [ ref seg] , _} ] =>
1520
1519
assert_eq ! ( mtwt_resolve( seg. identifier) , a3_name) ,
1521
1520
_ => assert_eq ! ( 0 , 1 )
1522
1521
}
@@ -1623,11 +1622,15 @@ mod test {
1623
1622
} ;
1624
1623
let cr = expand_crate_str ( teststr. to_managed ( ) ) ;
1625
1624
// find the bindings:
1626
- let bindings = @mut ~[ ] ;
1627
- visit:: walk_crate ( & mut new_name_finder ( bindings) , & cr, ( ) ) ;
1625
+ let mut name_finder = new_name_finder ( ~[ ] ) ;
1626
+ visit:: walk_crate ( & mut name_finder, & cr, ( ) ) ;
1627
+ let bindings = name_finder. ident_accumulator ;
1628
+
1628
1629
// find the varrefs:
1629
- let varrefs = @mut ~[ ] ;
1630
- visit:: walk_crate ( & mut new_path_finder ( varrefs) , & cr, ( ) ) ;
1630
+ let mut path_finder = new_path_finder ( ~[ ] ) ;
1631
+ visit:: walk_crate ( & mut path_finder, & cr, ( ) ) ;
1632
+ let varrefs = path_finder. path_accumulator ;
1633
+
1631
1634
// must be one check clause for each binding:
1632
1635
assert_eq ! ( bindings. len( ) , bound_connections. len( ) ) ;
1633
1636
for ( binding_idx, shouldmatch) in bound_connections. iter ( ) . enumerate ( ) {
@@ -1686,8 +1689,10 @@ foo_module!()
1686
1689
";
1687
1690
let cr = expand_crate_str(crate_str);
1688
1691
// find the xx binding
1689
- let bindings = @mut ~[];
1690
- visit::walk_crate(&mut new_name_finder(bindings), &cr, ());
1692
+ let mut name_finder = new_name_finder(~[]);
1693
+ visit::walk_crate(&mut name_finder, &cr, ());
1694
+ let bindings = name_finder.ident_accumulator;
1695
+
1691
1696
let cxbinds : ~[&ast::Ident] =
1692
1697
bindings.iter().filter(|b|{@" xx" == ( ident_to_str ( * b) ) } ) . collect ( ) ;
1693
1698
let cxbind = match cxbinds {
@@ -1696,8 +1701,10 @@ foo_module!()
1696
1701
} ;
1697
1702
let resolved_binding = mtwt_resolve ( * cxbind) ;
1698
1703
// find all the xx varrefs:
1699
- let varrefs = @mut ~[ ] ;
1700
- visit:: walk_crate ( & mut new_path_finder ( varrefs) , & cr, ( ) ) ;
1704
+ let mut path_finder = new_path_finder ( ~[ ] ) ;
1705
+ visit:: walk_crate ( & mut path_finder, & cr, ( ) ) ;
1706
+ let varrefs = path_finder. path_accumulator ;
1707
+
1701
1708
// the xx binding should bind all of the xx varrefs:
1702
1709
for ( idx, v) in varrefs. iter ( ) . filter ( |p|{ p. segments . len ( ) == 1
1703
1710
&& ( @"xx" == ( ident_to_str ( & p. segments [ 0 ] . identifier ) ) )
@@ -1723,10 +1730,10 @@ foo_module!()
1723
1730
#[ test]
1724
1731
fn pat_idents ( ) {
1725
1732
let pat = string_to_pat ( @"( a, Foo { x : c @ ( b, 9 ) , y : Bar ( 4 , d) } ) ") ;
1726
- let idents = @mut ~[ ] ;
1727
- let pat_idents = new_name_finder ( idents) ;
1733
+ let mut pat_idents = new_name_finder ( ~[ ] ) ;
1728
1734
pat_idents. visit_pat ( pat, ( ) ) ;
1729
- assert_eq ! ( idents, @mut strs_to_idents( ~[ "a" , "c" , "b" , "d" ] ) ) ;
1735
+ assert_eq ! ( pat_idents. ident_accumulator,
1736
+ strs_to_idents( ~[ "a" , "c" , "b" , "d" ] ) ) ;
1730
1737
}
1731
1738
1732
1739
}
0 commit comments