@@ -443,18 +443,41 @@ 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 ( & self , mut span : Span , to : Span , attr_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 !attr_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
+
458
481
fn adjust ( & self , ctxt : & mut SyntaxContext , expn_id : ExpnId ) -> Option < ExpnId > {
459
482
let mut scope = None ;
460
483
while !self . is_descendant_of ( expn_id, self . outer_expn ( * ctxt) ) {
@@ -571,6 +594,10 @@ pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
571
594
HygieneData :: with ( |data| data. walk_chain ( span, to) )
572
595
}
573
596
597
+ pub fn walk_chain_collapsed ( span : Span , to : Span , attr_enabled : bool ) -> Span {
598
+ HygieneData :: with ( |hdata| hdata. walk_chain_collapsed ( span, to, attr_enabled) )
599
+ }
600
+
574
601
pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
575
602
// The new contexts that need updating are at the end of the list and have `$crate` as a name.
576
603
let ( len, to_update) = HygieneData :: with ( |data| {
0 commit comments