@@ -443,18 +443,41 @@ 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 ( & self , mut span : Span , to : Span , collapse_debuginfo_enabled : bool ) -> Span {
462+ let orig_span = span;
463+ let mut ret_span = span;
464+
465+ debug ! ( "walk_chain_collapsed({:?}, {:?})" , span, to) ;
466+ debug ! ( "walk_chain_collapsed: span ctxt = {:?}" , span. ctxt( ) ) ;
467+ while !span. eq_ctxt ( to) && span. from_expansion ( ) {
468+ let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
469+ debug ! ( "walk_chain_collapsed({:?}): outer_expn={:?}" , span, outer_expn) ;
470+ let expn_data = self . expn_data ( outer_expn) ;
471+ debug ! ( "walk_chain_collapsed({:?}): expn_data={:?}" , span, expn_data) ;
472+ span = expn_data. call_site ;
473+ if !collapse_debuginfo_enabled || expn_data. collapse_debuginfo {
474+ ret_span = span;
475+ }
476+ }
477+ debug ! ( "walk_chain_collapsed: for span {:?} >>> return span = {:?}" , orig_span, ret_span) ;
478+ ret_span
479+ }
480+
458481 fn adjust ( & self , ctxt : & mut SyntaxContext , expn_id : ExpnId ) -> Option < ExpnId > {
459482 let mut scope = None ;
460483 while !self . is_descendant_of ( expn_id, self . outer_expn ( * ctxt) ) {
@@ -571,6 +594,10 @@ pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
571594 HygieneData :: with ( |data| data. walk_chain ( span, to) )
572595}
573596
597+ pub fn walk_chain_collapsed ( span : Span , to : Span , collapse_debuginfo_enabled : bool ) -> Span {
598+ HygieneData :: with ( |hdata| hdata. walk_chain_collapsed ( span, to, collapse_debuginfo_enabled) )
599+ }
600+
574601pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
575602 // The new contexts that need updating are at the end of the list and have `$crate` as a name.
576603 let ( len, to_update) = HygieneData :: with ( |data| {
0 commit comments