@@ -56,7 +56,7 @@ impl !PartialOrd for SyntaxContext {}
56
56
57
57
/// If this part of two syntax contexts is equal, then the whole syntax contexts should be equal.
58
58
/// The other fields are only for caching.
59
- type SyntaxContextKey = ( SyntaxContext , ExpnId , Transparency ) ;
59
+ pub type SyntaxContextKey = ( SyntaxContext , ExpnId , Transparency ) ;
60
60
61
61
#[ derive( Clone , Copy , Debug ) ]
62
62
struct SyntaxContextData {
@@ -71,17 +71,6 @@ struct SyntaxContextData {
71
71
dollar_crate_name : Symbol ,
72
72
}
73
73
74
- /// Same as `SyntaxContextData`, but `opaque(_and_semitransparent)` cannot be recursive
75
- /// and use `None` if they need to refer to self. Used for encoding and decoding metadata.
76
- #[ derive( Encodable , Decodable ) ]
77
- pub struct SyntaxContextDataNonRecursive {
78
- outer_expn : ExpnId ,
79
- outer_transparency : Transparency ,
80
- parent : SyntaxContext ,
81
- opaque : Option < SyntaxContext > ,
82
- opaque_and_semitransparent : Option < SyntaxContext > ,
83
- }
84
-
85
74
impl SyntaxContextData {
86
75
fn new (
87
76
( parent, outer_expn, outer_transparency) : SyntaxContextKey ,
@@ -122,19 +111,6 @@ impl SyntaxContextData {
122
111
}
123
112
}
124
113
125
- impl SyntaxContextDataNonRecursive {
126
- fn recursive ( & self , ctxt : SyntaxContext ) -> SyntaxContextData {
127
- SyntaxContextData {
128
- outer_expn : self . outer_expn ,
129
- outer_transparency : self . outer_transparency ,
130
- parent : self . parent ,
131
- opaque : self . opaque . unwrap_or ( ctxt) ,
132
- opaque_and_semitransparent : self . opaque_and_semitransparent . unwrap_or ( ctxt) ,
133
- dollar_crate_name : kw:: DollarCrate ,
134
- }
135
- }
136
- }
137
-
138
114
rustc_index:: newtype_index! {
139
115
/// A unique ID associated with a macro invocation and expansion.
140
116
#[ orderable]
@@ -658,19 +634,6 @@ impl HygieneData {
658
634
SyntaxContextData :: new ( key, opaque, opaque_and_semitransparent) ;
659
635
ctxt
660
636
}
661
-
662
- fn non_recursive_ctxt ( & self , ctxt : SyntaxContext ) -> SyntaxContextDataNonRecursive {
663
- debug_assert ! ( !self . syntax_context_data[ ctxt. 0 as usize ] . is_decode_placeholder( ) ) ;
664
- let data = & self . syntax_context_data [ ctxt. 0 as usize ] ;
665
- SyntaxContextDataNonRecursive {
666
- outer_expn : data. outer_expn ,
667
- outer_transparency : data. outer_transparency ,
668
- parent : data. parent ,
669
- opaque : ( data. opaque != ctxt) . then_some ( data. opaque ) ,
670
- opaque_and_semitransparent : ( data. opaque_and_semitransparent != ctxt)
671
- . then_some ( data. opaque_and_semitransparent ) ,
672
- }
673
- }
674
637
}
675
638
676
639
pub fn walk_chain ( span : Span , to : SyntaxContext ) -> Span {
@@ -1300,7 +1263,7 @@ impl HygieneEncodeContext {
1300
1263
pub fn encode < T > (
1301
1264
& self ,
1302
1265
encoder : & mut T ,
1303
- mut encode_ctxt : impl FnMut ( & mut T , u32 , & SyntaxContextDataNonRecursive ) ,
1266
+ mut encode_ctxt : impl FnMut ( & mut T , u32 , & SyntaxContextKey ) ,
1304
1267
mut encode_expn : impl FnMut ( & mut T , ExpnId , & ExpnData , ExpnHash ) ,
1305
1268
) {
1306
1269
// When we serialize a `SyntaxContextData`, we may end up serializing
@@ -1425,10 +1388,7 @@ pub fn decode_expn_id(
1425
1388
// to track which `SyntaxContext`s we have already decoded.
1426
1389
// The provided closure will be invoked to deserialize a `SyntaxContextData`
1427
1390
// if we haven't already seen the id of the `SyntaxContext` we are deserializing.
1428
- pub fn decode_syntax_context <
1429
- D : Decoder ,
1430
- F : FnOnce ( & mut D , u32 ) -> SyntaxContextDataNonRecursive ,
1431
- > (
1391
+ pub fn decode_syntax_context < D : Decoder , F : FnOnce ( & mut D , u32 ) -> SyntaxContextKey > (
1432
1392
d : & mut D ,
1433
1393
context : & HygieneDecodeContext ,
1434
1394
decode_data : F ,
@@ -1450,16 +1410,9 @@ pub fn decode_syntax_context<
1450
1410
1451
1411
// Don't try to decode data while holding the lock, since we need to
1452
1412
// be able to recursively decode a SyntaxContext
1453
- let ctxt_data = decode_data ( d, raw_id) ;
1454
-
1455
- let ctxt = HygieneData :: with ( |hygiene_data| {
1456
- let ctxt_key = ( ctxt_data. parent , ctxt_data. outer_expn , ctxt_data. outer_transparency ) ;
1457
- * hygiene_data. syntax_context_map . entry ( ctxt_key) . or_insert_with ( || {
1458
- let ctxt = SyntaxContext :: from_usize ( hygiene_data. syntax_context_data . len ( ) ) ;
1459
- hygiene_data. syntax_context_data . push ( ctxt_data. recursive ( ctxt) ) ;
1460
- ctxt
1461
- } )
1462
- } ) ;
1413
+ let ( parent, expn_id, transparency) = decode_data ( d, raw_id) ;
1414
+ let ctxt =
1415
+ HygieneData :: with ( |hygiene_data| hygiene_data. alloc_ctxt ( parent, expn_id, transparency) ) ;
1463
1416
1464
1417
let mut inner = context. inner . lock ( ) ;
1465
1418
let new_len = raw_id as usize + 1 ;
@@ -1471,12 +1424,21 @@ pub fn decode_syntax_context<
1471
1424
ctxt
1472
1425
}
1473
1426
1474
- fn for_all_ctxts_in < F : FnMut ( u32 , SyntaxContext , & SyntaxContextDataNonRecursive ) > (
1427
+ fn for_all_ctxts_in < F : FnMut ( u32 , SyntaxContext , & SyntaxContextKey ) > (
1475
1428
ctxts : impl Iterator < Item = SyntaxContext > ,
1476
1429
mut f : F ,
1477
1430
) {
1478
- let all_data: Vec < _ > =
1479
- HygieneData :: with ( |data| ctxts. map ( |ctxt| ( ctxt, data. non_recursive_ctxt ( ctxt) ) ) . collect ( ) ) ;
1431
+ let all_data: Vec < _ > = HygieneData :: with ( |data| {
1432
+ ctxts
1433
+ . map ( |ctxt| {
1434
+ ( ctxt, {
1435
+ let item = data. syntax_context_data [ ctxt. 0 as usize ] ;
1436
+ debug_assert ! ( !item. is_decode_placeholder( ) ) ;
1437
+ item. key ( )
1438
+ } )
1439
+ } )
1440
+ . collect ( )
1441
+ } ) ;
1480
1442
for ( ctxt, data) in all_data. into_iter ( ) {
1481
1443
f ( ctxt. 0 , ctxt, & data) ;
1482
1444
}
0 commit comments