@@ -310,7 +310,7 @@ impl ExpnId {
310310}
311311
312312#[ derive( Debug ) ]
313- pub ( crate ) struct HygieneData {
313+ pub struct HygieneData {
314314 /// Each expansion should have an associated expansion data, but sometimes there's a delay
315315 /// between creation of an expansion ID and obtaining its data (e.g. macros are collected
316316 /// first and then resolved later), so we use an `Option` here.
@@ -377,7 +377,7 @@ impl HygieneData {
377377 self . local_expn_data [ expn_id] . as_ref ( ) . expect ( "no expansion data for an expansion ID" )
378378 }
379379
380- fn expn_data ( & self , expn_id : ExpnId ) -> & ExpnData {
380+ pub fn expn_data ( & self , expn_id : ExpnId ) -> & ExpnData {
381381 if let Some ( expn_id) = expn_id. as_local ( ) {
382382 self . local_expn_data [ expn_id] . as_ref ( ) . expect ( "no expansion data for an expansion ID" )
383383 } else {
@@ -412,7 +412,7 @@ impl HygieneData {
412412 self . syntax_context_data [ ctxt. 0 as usize ] . opaque_and_semitransparent
413413 }
414414
415- fn outer_expn ( & self , ctxt : SyntaxContext ) -> ExpnId {
415+ pub fn outer_expn ( & self , ctxt : SyntaxContext ) -> ExpnId {
416416 self . syntax_context_data [ ctxt. 0 as usize ] . outer_expn
417417 }
418418
@@ -443,18 +443,38 @@ impl HygieneData {
443443 }
444444
445445 fn walk_chain ( & self , mut span : Span , to : SyntaxContext ) -> Span {
446- debug ! ( "walk_chain({:?}, {:?})" , span, to) ;
447- debug ! ( "walk_chain: span ctxt = {:?}" , span. ctxt( ) ) ;
448- while span. from_expansion ( ) && span. ctxt ( ) != to {
446+ trace ! ( "walk_chain({:?}, {:?})" , span, to) ;
447+ trace ! ( "walk_chain: span ctxt = {:?}" , span. ctxt( ) ) ;
448+ while span. ctxt ( ) != to && span. from_expansion ( ) {
449449 let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
450- debug ! ( "walk_chain({:?}): outer_expn={:?}" , span, outer_expn) ;
450+ trace ! ( "walk_chain({:?}): outer_expn={:?}" , span, outer_expn) ;
451451 let expn_data = self . expn_data ( outer_expn) ;
452- debug ! ( "walk_chain({:?}): expn_data={:?}" , span, expn_data) ;
452+ trace ! ( "walk_chain({:?}): expn_data={:?}" , span, expn_data) ;
453453 span = expn_data. call_site ;
454454 }
455455 span
456456 }
457457
458+ fn walk_chain_collapsed < F : Fn ( & HygieneData , Span ) -> bool > (
459+ & self ,
460+ mut span : Span ,
461+ to : SyntaxContext ,
462+ should_collapse : F ,
463+ ) -> Span {
464+ let orig_span = span;
465+ trace ! ( "walk_chain_collapsed({:?}, {:?})" , span, to) ;
466+ trace ! ( "walk_chain_collapsed: span ctxt = {:?}" , span. ctxt( ) ) ;
467+ while span. ctxt ( ) != to && should_collapse ( & self , span) {
468+ let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
469+ trace ! ( "walk_chain_collapsed({:?}): outer_expn={:?}" , span, outer_expn) ;
470+ let expn_data = self . expn_data ( outer_expn) ;
471+ trace ! ( "walk_chain_collapsed({:?}): expn_data={:?}" , span, expn_data) ;
472+ span = expn_data. call_site ;
473+ }
474+ trace ! ( "walk_chain_collapsed: for span {:?} >>> return span = {:?}" , orig_span, span) ;
475+ span
476+ }
477+
458478 fn adjust ( & self , ctxt : & mut SyntaxContext , expn_id : ExpnId ) -> Option < ExpnId > {
459479 let mut scope = None ;
460480 while !self . is_descendant_of ( expn_id, self . outer_expn ( * ctxt) ) {
@@ -568,9 +588,25 @@ impl HygieneData {
568588}
569589
570590pub fn walk_chain ( span : Span , to : SyntaxContext ) -> Span {
591+ debug ! ( "walk_chain call({:?}, {:?})" , span, to) ;
571592 HygieneData :: with ( |data| data. walk_chain ( span, to) )
572593}
573594
595+ pub fn walk_chain_collapsed < F : Fn ( & HygieneData , Span ) -> bool > (
596+ span : Span ,
597+ to : SyntaxContext ,
598+ should_collapse : F ,
599+ ) -> Span {
600+ debug ! ( "walk_chain_collapsed call({:?}, {:?})" , span, to) ;
601+ HygieneData :: with ( |hdata| {
602+ if should_collapse ( hdata, span) {
603+ hdata. walk_chain_collapsed ( span, to, should_collapse)
604+ } else {
605+ span
606+ }
607+ } )
608+ }
609+
574610pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
575611 // The new contexts that need updating are at the end of the list and have `$crate` as a name.
576612 let ( len, to_update) = HygieneData :: with ( |data| {
@@ -938,7 +974,7 @@ pub struct ExpnData {
938974 pub local_inner_macros : bool ,
939975 /// Should debuginfo for the macro be collapsed to the outermost expansion site (in other
940976 /// words, was the macro definition annotated with `#[collapse_debuginfo]`)?
941- pub ( crate ) collapse_debuginfo : bool ,
977+ pub collapse_debuginfo : bool ,
942978}
943979
944980impl !PartialEq for ExpnData { }
@@ -1279,7 +1315,7 @@ pub fn decode_expn_id(
12791315 decode_data : impl FnOnce ( ExpnId ) -> ( ExpnData , ExpnHash ) ,
12801316) -> ExpnId {
12811317 if index == 0 {
1282- trace ! ( "decode_expn_id: deserialized root" ) ;
1318+ // trace!("decode_expn_id: deserialized root");
12831319 return ExpnId :: root ( ) ;
12841320 }
12851321
@@ -1312,7 +1348,7 @@ pub fn decode_syntax_context<D: Decoder, F: FnOnce(&mut D, u32) -> SyntaxContext
13121348) -> SyntaxContext {
13131349 let raw_id: u32 = Decodable :: decode ( d) ;
13141350 if raw_id == 0 {
1315- trace ! ( "decode_syntax_context: deserialized root" ) ;
1351+ // trace!("decode_syntax_context: deserialized root");
13161352 // The root is special
13171353 return SyntaxContext :: root ( ) ;
13181354 }
0 commit comments