@@ -445,18 +445,46 @@ impl HygieneData {
445
445
}
446
446
447
447
fn walk_chain ( & self , mut span : Span , to : SyntaxContext ) -> Span {
448
+ let orig_span = span;
448
449
debug ! ( "walk_chain({:?}, {:?})" , span, to) ;
449
450
debug ! ( "walk_chain: span ctxt = {:?}" , span. ctxt( ) ) ;
450
- while span. from_expansion ( ) && span. ctxt ( ) != to {
451
+ while span. ctxt ( ) != to && span. from_expansion ( ) {
451
452
let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
452
453
debug ! ( "walk_chain({:?}): outer_expn={:?}" , span, outer_expn) ;
453
454
let expn_data = self . expn_data ( outer_expn) ;
454
455
debug ! ( "walk_chain({:?}): expn_data={:?}" , span, expn_data) ;
455
456
span = expn_data. call_site ;
456
457
}
458
+ debug ! ( "walk_chain: for span {:?} >>> return span = {:?}" , orig_span, span) ;
457
459
span
458
460
}
459
461
462
+ // We need to walk up and update return span if we meet macro instantiation to be collapsed
463
+ fn walk_chain_collapsed (
464
+ & self ,
465
+ mut span : Span ,
466
+ to : Span ,
467
+ collapse_debuginfo_enabled : bool ,
468
+ ) -> Span {
469
+ let orig_span = span;
470
+ let mut ret_span = span;
471
+
472
+ debug ! ( "walk_chain_collapsed({:?}, {:?})" , span, to) ;
473
+ debug ! ( "walk_chain_collapsed: span ctxt = {:?}" , span. ctxt( ) ) ;
474
+ while !span. eq_ctxt ( to) && span. from_expansion ( ) {
475
+ let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
476
+ debug ! ( "walk_chain_collapsed({:?}): outer_expn={:?}" , span, outer_expn) ;
477
+ let expn_data = self . expn_data ( outer_expn) ;
478
+ debug ! ( "walk_chain_collapsed({:?}): expn_data={:?}" , span, expn_data) ;
479
+ span = expn_data. call_site ;
480
+ if !collapse_debuginfo_enabled || expn_data. collapse_debuginfo {
481
+ ret_span = span;
482
+ }
483
+ }
484
+ debug ! ( "walk_chain_collapsed: for span {:?} >>> return span = {:?}" , orig_span, ret_span) ;
485
+ ret_span
486
+ }
487
+
460
488
fn adjust ( & self , ctxt : & mut SyntaxContext , expn_id : ExpnId ) -> Option < ExpnId > {
461
489
let mut scope = None ;
462
490
while !self . is_descendant_of ( expn_id, self . outer_expn ( * ctxt) ) {
@@ -573,6 +601,10 @@ pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
573
601
HygieneData :: with ( |data| data. walk_chain ( span, to) )
574
602
}
575
603
604
+ pub fn walk_chain_collapsed ( span : Span , to : Span , collapse_debuginfo_enabled : bool ) -> Span {
605
+ HygieneData :: with ( |hdata| hdata. walk_chain_collapsed ( span, to, collapse_debuginfo_enabled) )
606
+ }
607
+
576
608
pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
577
609
// The new contexts that need updating are at the end of the list and have `$crate` as a name.
578
610
let ( len, to_update) = HygieneData :: with ( |data| {
0 commit comments