@@ -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,15 +443,37 @@ impl HygieneData {
443443 }
444444
445445 fn walk_chain ( & self , mut span : Span , to : SyntaxContext ) -> Span {
446+ let orig_span = span;
446447 debug ! ( "walk_chain({:?}, {:?})" , span, to) ;
447448 debug ! ( "walk_chain: span ctxt = {:?}" , span. ctxt( ) ) ;
448- while span. from_expansion ( ) && span. ctxt ( ) != to {
449+ while span. ctxt ( ) != to && span. from_expansion ( ) {
449450 let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
450451 debug ! ( "walk_chain({:?}): outer_expn={:?}" , span, outer_expn) ;
451452 let expn_data = self . expn_data ( outer_expn) ;
452453 debug ! ( "walk_chain({:?}): expn_data={:?}" , span, expn_data) ;
453454 span = expn_data. call_site ;
454455 }
456+ debug ! ( "walk_chain: for span {:?} >>> return span = {:?}" , orig_span, span) ;
457+ span
458+ }
459+
460+ fn walk_chain_collapsed < F : Fn ( & HygieneData , Span ) -> bool > (
461+ & self ,
462+ mut span : Span ,
463+ to : SyntaxContext ,
464+ should_collapse : F ,
465+ ) -> Span {
466+ let orig_span = span;
467+ debug ! ( "walk_chain_collapsed({:?}, {:?})" , span, to) ;
468+ debug ! ( "walk_chain_collapsed: span ctxt = {:?}" , span. ctxt( ) ) ;
469+ while span. ctxt ( ) != to && should_collapse ( & self , span) {
470+ let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
471+ debug ! ( "walk_chain_collapsed({:?}): outer_expn={:?}" , span, outer_expn) ;
472+ let expn_data = self . expn_data ( outer_expn) ;
473+ debug ! ( "walk_chain_collapsed({:?}): expn_data={:?}" , span, expn_data) ;
474+ span = expn_data. call_site ;
475+ }
476+ debug ! ( "walk_chain_collapsed: for span {:?} >>> return span = {:?}" , orig_span, span) ;
455477 span
456478 }
457479
@@ -571,6 +593,20 @@ pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
571593 HygieneData :: with ( |data| data. walk_chain ( span, to) )
572594}
573595
596+ pub fn walk_chain_collapsed < F : Fn ( & HygieneData , Span ) -> bool > (
597+ span : Span ,
598+ to : SyntaxContext ,
599+ should_collapse : F ,
600+ ) -> Span {
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 { }
0 commit comments