@@ -310,7 +310,7 @@ impl ExpnId {
310
310
}
311
311
312
312
#[ derive( Debug ) ]
313
- pub ( crate ) struct HygieneData {
313
+ pub struct HygieneData {
314
314
/// Each expansion should have an associated expansion data, but sometimes there's a delay
315
315
/// between creation of an expansion ID and obtaining its data (e.g. macros are collected
316
316
/// first and then resolved later), so we use an `Option` here.
@@ -377,7 +377,7 @@ impl HygieneData {
377
377
self . local_expn_data [ expn_id] . as_ref ( ) . expect ( "no expansion data for an expansion ID" )
378
378
}
379
379
380
- fn expn_data ( & self , expn_id : ExpnId ) -> & ExpnData {
380
+ pub fn expn_data ( & self , expn_id : ExpnId ) -> & ExpnData {
381
381
if let Some ( expn_id) = expn_id. as_local ( ) {
382
382
self . local_expn_data [ expn_id] . as_ref ( ) . expect ( "no expansion data for an expansion ID" )
383
383
} else {
@@ -412,7 +412,7 @@ impl HygieneData {
412
412
self . syntax_context_data [ ctxt. 0 as usize ] . opaque_and_semitransparent
413
413
}
414
414
415
- fn outer_expn ( & self , ctxt : SyntaxContext ) -> ExpnId {
415
+ pub fn outer_expn ( & self , ctxt : SyntaxContext ) -> ExpnId {
416
416
self . syntax_context_data [ ctxt. 0 as usize ] . outer_expn
417
417
}
418
418
@@ -443,15 +443,37 @@ 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) ;
457
+ span
458
+ }
459
+
460
+ fn walk_chain_collapsed < F : Fn ( & HygieneData , Span ) -> bool > (
461
+ & self ,
462
+ mut span : Span ,
463
+ to : SyntaxContext ,
464
+ should_collapse : F ,
465
+ ) -> Span {
466
+ let orig_span = span;
467
+ debug ! ( "walk_chain_collapsed({:?}, {:?})" , span, to) ;
468
+ debug ! ( "walk_chain_collapsed: span ctxt = {:?}" , span. ctxt( ) ) ;
469
+ while span. ctxt ( ) != to && should_collapse ( & self , span) {
470
+ let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
471
+ debug ! ( "walk_chain_collapsed({:?}): outer_expn={:?}" , span, outer_expn) ;
472
+ let expn_data = self . expn_data ( outer_expn) ;
473
+ debug ! ( "walk_chain_collapsed({:?}): expn_data={:?}" , span, expn_data) ;
474
+ span = expn_data. call_site ;
475
+ }
476
+ debug ! ( "walk_chain_collapsed: for span {:?} >>> return span = {:?}" , orig_span, span) ;
455
477
span
456
478
}
457
479
@@ -571,6 +593,20 @@ pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
571
593
HygieneData :: with ( |data| data. walk_chain ( span, to) )
572
594
}
573
595
596
+ pub fn walk_chain_collapsed < F : Fn ( & HygieneData , Span ) -> bool > (
597
+ span : Span ,
598
+ to : SyntaxContext ,
599
+ should_collapse : F ,
600
+ ) -> Span {
601
+ HygieneData :: with ( |hdata| {
602
+ if should_collapse ( hdata, span) {
603
+ hdata. walk_chain_collapsed ( span, to, should_collapse)
604
+ } else {
605
+ span
606
+ }
607
+ } )
608
+ }
609
+
574
610
pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
575
611
// The new contexts that need updating are at the end of the list and have `$crate` as a name.
576
612
let ( len, to_update) = HygieneData :: with ( |data| {
@@ -938,7 +974,7 @@ pub struct ExpnData {
938
974
pub local_inner_macros : bool ,
939
975
/// Should debuginfo for the macro be collapsed to the outermost expansion site (in other
940
976
/// words, was the macro definition annotated with `#[collapse_debuginfo]`)?
941
- pub ( crate ) collapse_debuginfo : bool ,
977
+ pub collapse_debuginfo : bool ,
942
978
}
943
979
944
980
impl !PartialEq for ExpnData { }
0 commit comments