@@ -56,7 +56,7 @@ impl !PartialOrd for SyntaxContext {}
5656
5757/// If this part of two syntax contexts is equal, then the whole syntax contexts should be equal.
5858/// The other fields are only for caching.
59- type SyntaxContextKey = ( SyntaxContext , ExpnId , Transparency ) ;
59+ pub type SyntaxContextKey = ( SyntaxContext , ExpnId , Transparency ) ;
6060
6161#[ derive( Clone , Copy , Debug ) ]
6262struct SyntaxContextData {
@@ -71,17 +71,6 @@ struct SyntaxContextData {
7171 dollar_crate_name : Symbol ,
7272}
7373
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-
8574impl SyntaxContextData {
8675 fn new (
8776 ( parent, outer_expn, outer_transparency) : SyntaxContextKey ,
@@ -122,19 +111,6 @@ impl SyntaxContextData {
122111 }
123112}
124113
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-
138114rustc_index:: newtype_index! {
139115 /// A unique ID associated with a macro invocation and expansion.
140116 #[ orderable]
@@ -658,19 +634,6 @@ impl HygieneData {
658634 SyntaxContextData :: new ( key, opaque, opaque_and_semitransparent) ;
659635 ctxt
660636 }
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- }
674637}
675638
676639pub fn walk_chain ( span : Span , to : SyntaxContext ) -> Span {
@@ -1300,7 +1263,7 @@ impl HygieneEncodeContext {
13001263 pub fn encode < T > (
13011264 & self ,
13021265 encoder : & mut T ,
1303- mut encode_ctxt : impl FnMut ( & mut T , u32 , & SyntaxContextDataNonRecursive ) ,
1266+ mut encode_ctxt : impl FnMut ( & mut T , u32 , & SyntaxContextKey ) ,
13041267 mut encode_expn : impl FnMut ( & mut T , ExpnId , & ExpnData , ExpnHash ) ,
13051268 ) {
13061269 // When we serialize a `SyntaxContextData`, we may end up serializing
@@ -1425,10 +1388,7 @@ pub fn decode_expn_id(
14251388// to track which `SyntaxContext`s we have already decoded.
14261389// The provided closure will be invoked to deserialize a `SyntaxContextData`
14271390// 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 > (
14321392 d : & mut D ,
14331393 context : & HygieneDecodeContext ,
14341394 decode_data : F ,
@@ -1450,16 +1410,9 @@ pub fn decode_syntax_context<
14501410
14511411 // Don't try to decode data while holding the lock, since we need to
14521412 // 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) ) ;
14631416
14641417 let mut inner = context. inner . lock ( ) ;
14651418 let new_len = raw_id as usize + 1 ;
@@ -1471,12 +1424,21 @@ pub fn decode_syntax_context<
14711424 ctxt
14721425}
14731426
1474- fn for_all_ctxts_in < F : FnMut ( u32 , SyntaxContext , & SyntaxContextDataNonRecursive ) > (
1427+ fn for_all_ctxts_in < F : FnMut ( u32 , SyntaxContext , & SyntaxContextKey ) > (
14751428 ctxts : impl Iterator < Item = SyntaxContext > ,
14761429 mut f : F ,
14771430) {
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+ } ) ;
14801442 for ( ctxt, data) in all_data. into_iter ( ) {
14811443 f ( ctxt. 0 , ctxt, & data) ;
14821444 }
0 commit comments