@@ -443,18 +443,46 @@ impl HygieneData {
443
443
}
444
444
445
445
fn walk_chain ( & self , mut span : Span , to : SyntaxContext ) -> Span {
446
+ let orig_span = span;
446
447
debug ! ( "walk_chain({:?}, {:?})" , span, to) ;
447
448
debug ! ( "walk_chain: span ctxt = {:?}" , span. ctxt( ) ) ;
448
- while span. from_expansion ( ) && span. ctxt ( ) != to {
449
+ while span. ctxt ( ) != to && span. from_expansion ( ) {
449
450
let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
450
451
debug ! ( "walk_chain({:?}): outer_expn={:?}" , span, outer_expn) ;
451
452
let expn_data = self . expn_data ( outer_expn) ;
452
453
debug ! ( "walk_chain({:?}): expn_data={:?}" , span, expn_data) ;
453
454
span = expn_data. call_site ;
454
455
}
456
+ debug ! ( "walk_chain: for span {:?} >>> return span = {:?}" , orig_span, span) ;
455
457
span
456
458
}
457
459
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
+
458
486
fn adjust ( & self , ctxt : & mut SyntaxContext , expn_id : ExpnId ) -> Option < ExpnId > {
459
487
let mut scope = None ;
460
488
while !self . is_descendant_of ( expn_id, self . outer_expn ( * ctxt) ) {
@@ -571,6 +599,10 @@ pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
571
599
HygieneData :: with ( |data| data. walk_chain ( span, to) )
572
600
}
573
601
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
+
574
606
pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
575
607
// The new contexts that need updating are at the end of the list and have `$crate` as a name.
576
608
let ( len, to_update) = HygieneData :: with ( |data| {
0 commit comments