@@ -54,38 +54,51 @@ pub enum SyntaxContext_ {
54
54
IllegalCtxt
55
55
}
56
56
57
+ /// A list of ident->name renamings
58
+ pub type RenameList = Vec < ( Ident , Name ) > ;
59
+
57
60
/// Extend a syntax context with a given mark
58
- pub fn new_mark ( m : Mrk , tail : SyntaxContext ) -> SyntaxContext {
59
- with_sctable ( |table| new_mark_internal ( m, tail , table) )
61
+ pub fn new_mark ( m : Mrk , ctxt : SyntaxContext ) -> SyntaxContext {
62
+ with_sctable ( |table| new_mark_internal ( m, ctxt , table) )
60
63
}
61
64
62
- // Extend a syntax context with a given mark and table
63
- fn new_mark_internal ( m : Mrk , tail : SyntaxContext , table : & SCTable ) -> SyntaxContext {
64
- let key = ( tail , m) ;
65
+ // Extend a syntax context with a given mark and sctable (explicit memoization)
66
+ fn new_mark_internal ( m : Mrk , ctxt : SyntaxContext , table : & SCTable ) -> SyntaxContext {
67
+ let key = ( ctxt , m) ;
65
68
let new_ctxt = |_: & ( SyntaxContext , Mrk ) |
66
- idx_push ( & mut * table. table . borrow_mut ( ) , Mark ( m, tail ) ) ;
69
+ idx_push ( & mut * table. table . borrow_mut ( ) , Mark ( m, ctxt ) ) ;
67
70
68
71
* table. mark_memo . borrow_mut ( ) . find_or_insert_with ( key, new_ctxt)
69
72
}
70
73
71
74
/// Extend a syntax context with a given rename
72
75
pub fn new_rename ( id : Ident , to : Name ,
73
- tail : SyntaxContext ) -> SyntaxContext {
74
- with_sctable ( |table| new_rename_internal ( id, to, tail , table) )
76
+ ctxt : SyntaxContext ) -> SyntaxContext {
77
+ with_sctable ( |table| new_rename_internal ( id, to, ctxt , table) )
75
78
}
76
79
77
- // Extend a syntax context with a given rename and sctable
80
+ // Extend a syntax context with a given rename and sctable (explicit memoization)
78
81
fn new_rename_internal ( id : Ident ,
79
82
to : Name ,
80
- tail : SyntaxContext ,
83
+ ctxt : SyntaxContext ,
81
84
table : & SCTable ) -> SyntaxContext {
82
- let key = ( tail , id, to) ;
85
+ let key = ( ctxt , id, to) ;
83
86
let new_ctxt = |_: & ( SyntaxContext , Ident , Mrk ) |
84
- idx_push ( & mut * table. table . borrow_mut ( ) , Rename ( id, to, tail ) ) ;
87
+ idx_push ( & mut * table. table . borrow_mut ( ) , Rename ( id, to, ctxt ) ) ;
85
88
86
89
* table. rename_memo . borrow_mut ( ) . find_or_insert_with ( key, new_ctxt)
87
90
}
88
91
92
+ /// Apply a list of renamings to a context
93
+ // if these rename lists get long, it would make sense
94
+ // to consider memoizing this fold. This may come up
95
+ // when we add hygiene to item names.
96
+ pub fn new_renames ( renames : & RenameList , ctxt : SyntaxContext ) -> SyntaxContext {
97
+ renames. iter ( ) . fold ( ctxt, |ctxt, & ( from, to) | {
98
+ new_rename ( from, to, ctxt)
99
+ } )
100
+ }
101
+
89
102
/// Fetch the SCTable from TLS, create one if it doesn't yet exist.
90
103
pub fn with_sctable < T > ( op: |& SCTable | -> T ) -> T {
91
104
local_data_key ! ( sctable_key: Rc <SCTable >)
@@ -263,9 +276,9 @@ fn xor_push(marks: &mut Vec<Mrk>, mark: Mrk) {
263
276
264
277
#[ cfg( test) ]
265
278
mod tests {
266
- use ast:: * ;
279
+ use ast:: { EMPTY_CTXT , Ident , Mrk , Name , SyntaxContext } ;
267
280
use super :: { resolve, xor_push, new_mark_internal, new_sctable_internal} ;
268
- use super :: { new_rename_internal, marksof_internal, resolve_internal} ;
281
+ use super :: { new_rename_internal, new_renames , marksof_internal, resolve_internal} ;
269
282
use super :: { SCTable , EmptyCtxt , Mark , Rename , IllegalCtxt } ;
270
283
use std:: collections:: HashMap ;
271
284
@@ -480,4 +493,13 @@ mod tests {
480
493
resolve_internal ( id ( 30 , EMPTY_CTXT ) , & mut t, & mut rt) ;
481
494
assert_eq ! ( rt. len( ) , 2 ) ;
482
495
}
496
+
497
+ #[ test]
498
+ fn new_resolves_test ( ) {
499
+ let renames = vec ! ( ( Ident { name: 23 , ctxt: EMPTY_CTXT } , 24 ) ,
500
+ ( Ident { name: 29 , ctxt: EMPTY_CTXT } , 29 ) ) ;
501
+ let new_ctxt1 = new_renames ( & renames, EMPTY_CTXT ) ;
502
+ assert_eq ! ( resolve( Ident { name: 23 , ctxt: new_ctxt1} ) , 24 ) ;
503
+ assert_eq ! ( resolve( Ident { name: 29 , ctxt: new_ctxt1} ) , 29 ) ;
504
+ }
483
505
}
0 commit comments