11
11
use ast:: { P , Block , Crate , DeclLocal , ExprMac } ;
12
12
use ast:: { Local , Ident , MacInvocTT } ;
13
13
use ast:: { ItemMac , Mrk , Stmt , StmtDecl , StmtMac , StmtExpr , StmtSemi } ;
14
- use ast:: TokenTree ;
14
+ use ast:: { IdentKind , LifetimeIdent , PlainIdent , TokenTree } ;
15
15
use ast;
16
16
use ext:: mtwt;
17
17
use ext:: build:: AstBuilder ;
@@ -228,15 +228,15 @@ fn expand_loop_block(loop_block: P<Block>,
228
228
// syntax context otherwise an unrelated `break` or `continue` in
229
229
// the same context will pick that up in the deferred renaming pass
230
230
// and be renamed incorrectly.
231
- let mut rename_list = vec ! ( rename) ;
231
+ let mut rename_list = RenameLists { plain : Vec :: new ( ) , lifetime : vec ! ( rename) } ;
232
232
let mut rename_fld = renames_to_fold ( & mut rename_list) ;
233
- let renamed_ident = rename_fld. fold_ident ( label) ;
233
+ let renamed_ident = rename_fld. fold_ident ( label, LifetimeIdent ) ;
234
234
235
235
// The rename *must* be added to the enclosed syntax context for
236
236
// `break` or `continue` to pick up because by definition they are
237
237
// in a block enclosed by loop head.
238
238
fld. extsbox . push_frame ( ) ;
239
- fld. extsbox . info ( ) . pending_renames . push ( rename) ;
239
+ fld. extsbox . info ( ) . pending_renames . lifetime . push ( rename) ;
240
240
let expanded_block = expand_block_elts ( loop_block, fld) ;
241
241
fld. extsbox . pop_frame ( ) ;
242
242
@@ -627,10 +627,11 @@ fn expand_non_macro_stmt(s: &Stmt, fld: &mut MacroExpander)
627
627
let mut name_finder = new_name_finder ( Vec :: new ( ) ) ;
628
628
name_finder. visit_pat ( expanded_pat, ( ) ) ;
629
629
// generate fresh names, push them to a new pending list
630
- let mut new_pending_renames = Vec :: new ( ) ;
630
+ let mut new_pending_renames = RenameLists { plain : Vec :: new ( ) ,
631
+ lifetime : Vec :: new ( ) } ;
631
632
for ident in name_finder. ident_accumulator . iter ( ) {
632
633
let new_name = fresh_name ( ident) ;
633
- new_pending_renames. push ( ( * ident, new_name) ) ;
634
+ new_pending_renames. plain . push ( ( * ident, new_name) ) ;
634
635
}
635
636
let rewritten_pat = {
636
637
let mut rename_fld =
@@ -640,7 +641,8 @@ fn expand_non_macro_stmt(s: &Stmt, fld: &mut MacroExpander)
640
641
rename_fld. fold_pat ( expanded_pat)
641
642
} ;
642
643
// add them to the existing pending renames:
643
- fld. extsbox . info ( ) . pending_renames . push_all_move ( new_pending_renames) ;
644
+ fld. extsbox . info ( ) . pending_renames
645
+ . plain . push_all_move ( new_pending_renames. plain ) ;
644
646
// also, don't forget to expand the init:
645
647
let new_init_opt = init. map ( |e| fld. fold_expr ( e) ) ;
646
648
let rewritten_local =
@@ -760,13 +762,17 @@ pub fn expand_block_elts(b: &Block, fld: &mut MacroExpander) -> P<Block> {
760
762
}
761
763
762
764
pub struct IdentRenamer < ' a > {
763
- renames : & ' a mut RenameList ,
765
+ renames : & ' a mut RenameLists ,
764
766
}
765
767
766
768
impl < ' a > Folder for IdentRenamer < ' a > {
767
- fn fold_ident ( & mut self , id : Ident ) -> Ident {
768
- let new_ctxt = self . renames . iter ( ) . fold ( id. ctxt , |ctxt, & ( from, to) | {
769
- mtwt:: new_rename ( from, to, ctxt)
769
+ fn fold_ident ( & mut self , id : Ident , ns : IdentKind ) -> Ident {
770
+ let rs = match ns {
771
+ PlainIdent => & self . renames . plain ,
772
+ LifetimeIdent => & self . renames . lifetime
773
+ } ;
774
+ let new_ctxt = rs. iter ( ) . fold ( id. ctxt , |ctxt, & ( from, to) | {
775
+ mtwt:: new_rename ( from, to, ctxt, ns)
770
776
} ) ;
771
777
Ident {
772
778
name : id. name ,
@@ -777,7 +783,7 @@ impl<'a> Folder for IdentRenamer<'a> {
777
783
778
784
// given a mutable list of renames, return a tree-folder that applies those
779
785
// renames.
780
- pub fn renames_to_fold < ' a > ( renames : & ' a mut RenameList ) -> IdentRenamer < ' a > {
786
+ pub fn renames_to_fold < ' a > ( renames : & ' a mut RenameLists ) -> IdentRenamer < ' a > {
781
787
IdentRenamer {
782
788
renames : renames,
783
789
}
@@ -849,18 +855,18 @@ pub fn expand_crate(parse_sess: @parse::ParseSess,
849
855
struct Marker { mark : Mrk }
850
856
851
857
impl Folder for Marker {
852
- fn fold_ident ( & mut self , id : Ident ) -> Ident {
858
+ fn fold_ident ( & mut self , id : Ident , ns : IdentKind ) -> Ident {
853
859
ast:: Ident {
854
860
name : id. name ,
855
- ctxt : mtwt:: new_mark ( self . mark , id. ctxt )
861
+ ctxt : mtwt:: new_mark ( self . mark , id. ctxt , ns )
856
862
}
857
863
}
858
864
fn fold_mac ( & mut self , m : & ast:: Mac ) -> ast:: Mac {
859
865
let macro = match m. node {
860
866
MacInvocTT ( ref path, ref tts, ctxt) => {
861
867
MacInvocTT ( self . fold_path ( path) ,
862
868
fold_tts ( tts. as_slice ( ) , self ) ,
863
- mtwt:: new_mark ( self . mark , ctxt) )
869
+ mtwt:: new_mark ( self . mark , ctxt, PlainIdent ) )
864
870
}
865
871
} ;
866
872
Spanned {
@@ -1148,8 +1154,9 @@ mod test {
1148
1154
// must be one check clause for each binding:
1149
1155
assert_eq ! ( bindings. len( ) , bound_connections. len( ) ) ;
1150
1156
for ( binding_idx, shouldmatch) in bound_connections. iter ( ) . enumerate ( ) {
1151
- let binding_name = mtwt:: resolve ( * bindings. get ( binding_idx) ) ;
1152
- let binding_marks = mtwt:: marksof ( bindings. get ( binding_idx) . ctxt , invalid_name) ;
1157
+ let binding_name = mtwt:: resolve ( * bindings. get ( binding_idx) , ast:: PlainIdent ) ;
1158
+ let binding_marks = mtwt:: marksof ( bindings. get ( binding_idx) . ctxt ,
1159
+ invalid_name, ast:: PlainIdent ) ;
1153
1160
// shouldmatch can't name varrefs that don't exist:
1154
1161
assert ! ( ( shouldmatch. len( ) == 0 ) ||
1155
1162
( varrefs. len( ) > * shouldmatch. iter( ) . max( ) . unwrap( ) ) ) ;
@@ -1160,17 +1167,18 @@ mod test {
1160
1167
assert_eq ! ( varref. segments. len( ) , 1 ) ;
1161
1168
let varref_name = mtwt:: resolve ( varref. segments
1162
1169
. get ( 0 )
1163
- . identifier ) ;
1170
+ . identifier ,
1171
+ ast:: PlainIdent ) ;
1164
1172
let varref_marks = mtwt:: marksof ( varref. segments
1165
1173
. get ( 0 )
1166
1174
. identifier
1167
1175
. ctxt ,
1168
- invalid_name) ;
1176
+ invalid_name, ast :: PlainIdent ) ;
1169
1177
if !( varref_name==binding_name) {
1170
1178
println ! ( "uh oh, should match but doesn't:" ) ;
1171
1179
println ! ( "varref: {:?}" , varref) ;
1172
1180
println ! ( "binding: {:?}" , * bindings. get( binding_idx) ) ;
1173
- mtwt:: with_sctable ( |x| mtwt:: display_sctable ( x) ) ;
1181
+ mtwt:: with_sctable ( ast :: PlainIdent , |x| mtwt:: display_sctable ( x) ) ;
1174
1182
}
1175
1183
assert_eq ! ( varref_name, binding_name) ;
1176
1184
if bound_ident_check {
@@ -1180,7 +1188,7 @@ mod test {
1180
1188
}
1181
1189
} else {
1182
1190
let fail = ( varref. segments . len ( ) == 1 )
1183
- && ( mtwt:: resolve ( varref. segments . get ( 0 ) . identifier )
1191
+ && ( mtwt:: resolve ( varref. segments . get ( 0 ) . identifier , ast :: PlainIdent )
1184
1192
== binding_name) ;
1185
1193
// temp debugging:
1186
1194
if fail {
@@ -1197,7 +1205,7 @@ mod test {
1197
1205
varref. segments. get( 0 ) . identifier. name,
1198
1206
string. get( ) ) ;
1199
1207
println ! ( "binding: {:?}" , * bindings. get( binding_idx) ) ;
1200
- mtwt:: with_sctable ( |x| mtwt:: display_sctable ( x) ) ;
1208
+ mtwt:: with_sctable ( ast :: PlainIdent , |x| mtwt:: display_sctable ( x) ) ;
1201
1209
}
1202
1210
assert ! ( !fail) ;
1203
1211
}
@@ -1227,7 +1235,7 @@ foo_module!()
1227
1235
[ b] => b,
1228
1236
_ => fail ! ( "expected just one binding for ext_cx" )
1229
1237
} ;
1230
- let resolved_binding = mtwt:: resolve ( * cxbind) ;
1238
+ let resolved_binding = mtwt:: resolve ( * cxbind, ast :: PlainIdent ) ;
1231
1239
// find all the xx varrefs:
1232
1240
let mut path_finder = new_path_finder ( Vec :: new ( ) ) ;
1233
1241
visit:: walk_crate ( & mut path_finder, & cr, ( ) ) ;
@@ -1238,17 +1246,17 @@ foo_module!()
1238
1246
p. segments . len ( ) == 1
1239
1247
&& "xx" == token:: get_ident ( p. segments . get ( 0 ) . identifier ) . get ( )
1240
1248
} ) . enumerate ( ) {
1241
- if mtwt:: resolve ( v. segments . get ( 0 ) . identifier ) != resolved_binding {
1249
+ if mtwt:: resolve ( v. segments . get ( 0 ) . identifier , ast :: PlainIdent ) != resolved_binding {
1242
1250
println ! ( "uh oh, xx binding didn't match xx varref:" ) ;
1243
1251
println ! ( "this is xx varref \\ # {:?}" , idx) ;
1244
1252
println ! ( "binding: {:?}" , cxbind) ;
1245
1253
println ! ( "resolves to: {:?}" , resolved_binding) ;
1246
1254
println ! ( "varref: {:?}" , v. segments. get( 0 ) . identifier) ;
1247
1255
println ! ( "resolves to: {:?}" ,
1248
- mtwt:: resolve( v. segments. get( 0 ) . identifier) ) ;
1249
- mtwt:: with_sctable ( |x| mtwt:: display_sctable ( x) ) ;
1256
+ mtwt:: resolve( v. segments. get( 0 ) . identifier, ast :: PlainIdent ) ) ;
1257
+ mtwt:: with_sctable ( ast :: PlainIdent , |x| mtwt:: display_sctable ( x) ) ;
1250
1258
}
1251
- assert_eq ! ( mtwt:: resolve( v. segments. get( 0 ) . identifier) ,
1259
+ assert_eq ! ( mtwt:: resolve( v. segments. get( 0 ) . identifier, ast :: PlainIdent ) ,
1252
1260
resolved_binding) ;
1253
1261
} ;
1254
1262
}
0 commit comments