@@ -443,18 +443,46 @@ 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) ;
455457 span
456458 }
457459
460+ // We need to walk up and update return span if we meet macro instantiation to be collapsed
461+ fn walk_chain_collapsed (
462+ & self ,
463+ mut span : Span ,
464+ to : Span ,
465+ collapse_debuginfo_enabled : bool ,
466+ ) -> Span {
467+ let orig_span = span;
468+ let mut ret_span = span;
469+
470+ debug ! ( "walk_chain_collapsed({:?}, {:?})" , span, to) ;
471+ debug ! ( "walk_chain_collapsed: span ctxt = {:?}" , span. ctxt( ) ) ;
472+ while !span. eq_ctxt ( to) && span. from_expansion ( ) {
473+ let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
474+ debug ! ( "walk_chain_collapsed({:?}): outer_expn={:?}" , span, outer_expn) ;
475+ let expn_data = self . expn_data ( outer_expn) ;
476+ debug ! ( "walk_chain_collapsed({:?}): expn_data={:?}" , span, expn_data) ;
477+ span = expn_data. call_site ;
478+ if !collapse_debuginfo_enabled || expn_data. collapse_debuginfo {
479+ ret_span = span;
480+ }
481+ }
482+ debug ! ( "walk_chain_collapsed: for span {:?} >>> return span = {:?}" , orig_span, ret_span) ;
483+ ret_span
484+ }
485+
458486 fn adjust ( & self , ctxt : & mut SyntaxContext , expn_id : ExpnId ) -> Option < ExpnId > {
459487 let mut scope = None ;
460488 while !self . is_descendant_of ( expn_id, self . outer_expn ( * ctxt) ) {
@@ -571,6 +599,10 @@ pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
571599 HygieneData :: with ( |data| data. walk_chain ( span, to) )
572600}
573601
602+ pub fn walk_chain_collapsed ( span : Span , to : Span , collapse_debuginfo_enabled : bool ) -> Span {
603+ HygieneData :: with ( |hdata| hdata. walk_chain_collapsed ( span, to, collapse_debuginfo_enabled) )
604+ }
605+
574606pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
575607 // The new contexts that need updating are at the end of the list and have `$crate` as a name.
576608 let ( len, to_update) = HygieneData :: with ( |data| {
0 commit comments