@@ -13,7 +13,8 @@ use ast::{Local, Ident, mac_invoc_tt};
13
13
use ast:: { item_mac, Mrk , Stmt_ , StmtDecl , StmtMac , StmtExpr , StmtSemi } ;
14
14
use ast:: { token_tree} ;
15
15
use ast;
16
- use ast_util:: { new_rename, new_mark} ;
16
+ use ast_util:: { mtwt_outer_mark, new_rename, new_mark} ;
17
+ use ast_util;
17
18
use attr;
18
19
use attr:: AttrMetaMethods ;
19
20
use codemap;
@@ -1507,7 +1508,10 @@ pub fn renames_to_fold(renames : @mut ~[(ast::Ident,ast::Name)]) -> @AstFoldFns
1507
1508
}
1508
1509
1509
1510
// just a convenience:
1510
- pub fn new_mark_folder ( m : Mrk ) -> @AstFoldFns { fun_to_ctxt_folder ( @Marker { mark : m} ) }
1511
+ pub fn new_mark_folder ( m : Mrk ) -> @AstFoldFns {
1512
+ fun_to_ctxt_folder ( @Marker { mark : m} )
1513
+ }
1514
+
1511
1515
pub fn new_rename_folder ( from : ast:: Ident , to : ast:: Name ) -> @AstFoldFns {
1512
1516
fun_to_ctxt_folder ( @Renamer { from : from, to : to} )
1513
1517
}
@@ -1538,6 +1542,16 @@ pub fn replace_ctxts(expr : @ast::Expr, ctxt : SyntaxContext) -> @ast::Expr {
1538
1542
fun_to_ctxt_folder ( @Repainter { ctxt : ctxt} ) . fold_expr ( expr)
1539
1543
}
1540
1544
1545
+ // take the mark from the given ctxt (that has a mark at the outside),
1546
+ // and apply it to everything in the token trees, thereby cancelling
1547
+ // that mark.
1548
+ pub fn mtwt_cancel_outer_mark ( tts : & [ ast:: token_tree ] , ctxt : ast:: SyntaxContext )
1549
+ -> ~[ ast:: token_tree ] {
1550
+ let outer_mark = mtwt_outer_mark ( ctxt) ;
1551
+ mark_tts ( tts, outer_mark)
1552
+ }
1553
+
1554
+
1541
1555
#[ cfg( test) ]
1542
1556
mod test {
1543
1557
use super :: * ;
@@ -1546,13 +1560,15 @@ mod test {
1546
1560
use ast_util:: { get_sctable, mtwt_marksof, mtwt_resolve, new_rename} ;
1547
1561
use codemap;
1548
1562
use codemap:: Spanned ;
1563
+ use fold;
1549
1564
use parse;
1550
- use parse:: token:: { gensym, intern, get_ident_interner, ident_to_str} ;
1565
+ use parse:: token:: { fresh_mark, gensym, intern, get_ident_interner, ident_to_str} ;
1566
+ use parse:: token;
1551
1567
use print:: pprust;
1552
1568
use std;
1553
1569
use std:: vec;
1554
1570
use util:: parser_testing:: { string_to_crate, string_to_crate_and_sess, string_to_item} ;
1555
- use util:: parser_testing:: { string_to_pat, strs_to_idents} ;
1571
+ use util:: parser_testing:: { string_to_pat, string_to_tts , strs_to_idents} ;
1556
1572
use visit;
1557
1573
1558
1574
// make sure that fail! is present
@@ -1651,6 +1667,28 @@ mod test {
1651
1667
}
1652
1668
}
1653
1669
1670
+ #[ test] fn cancel_outer_mark_test ( ) {
1671
+ let invalid_name = token:: special_idents:: invalid. name ;
1672
+ let ident_str = @"x";
1673
+ let tts = string_to_tts ( ident_str) ;
1674
+ let fm = fresh_mark ( ) ;
1675
+ let marked_once = fold:: fold_tts ( tts, new_mark_folder ( fm) as @fold:: ast_fold ) ;
1676
+ assert_eq ! ( marked_once. len( ) , 1 ) ;
1677
+ let marked_once_ctxt =
1678
+ match marked_once[ 0 ] {
1679
+ ast:: tt_tok( _, token:: IDENT ( id, _) ) => id. ctxt ,
1680
+ _ => fail ! ( fmt!( "unexpected shape for marked tts: %?" , marked_once[ 0 ] ) )
1681
+ } ;
1682
+ assert_eq ! ( mtwt_marksof( marked_once_ctxt, invalid_name) , ~[ fm] ) ;
1683
+ let remarked = mtwt_cancel_outer_mark ( marked_once, marked_once_ctxt) ;
1684
+ assert_eq ! ( remarked. len( ) , 1 ) ;
1685
+ match remarked[ 0 ] {
1686
+ ast:: tt_tok( _, token:: IDENT ( id, _) ) =>
1687
+ assert_eq ! ( mtwt_marksof( id. ctxt, invalid_name) , ~[ ] ) ,
1688
+ _ => fail ! ( fmt!( "unexpected shape for marked tts: %?" , remarked[ 0 ] ) )
1689
+ }
1690
+ }
1691
+
1654
1692
#[ test]
1655
1693
fn renaming ( ) {
1656
1694
let item_ast = string_to_crate ( @"fn f ( ) -> int { a } ") ;
0 commit comments