@@ -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,18 +443,38 @@ impl HygieneData {
443
443
}
444
444
445
445
fn walk_chain ( & self , mut span : Span , to : SyntaxContext ) -> Span {
446
- debug ! ( "walk_chain({:?}, {:?})" , span, to) ;
447
- debug ! ( "walk_chain: span ctxt = {:?}" , span. ctxt( ) ) ;
448
- while span. from_expansion ( ) && span. ctxt ( ) != to {
446
+ trace ! ( "walk_chain({:?}, {:?})" , span, to) ;
447
+ trace ! ( "walk_chain: span ctxt = {:?}" , span. ctxt( ) ) ;
448
+ while span. ctxt ( ) != to && span. from_expansion ( ) {
449
449
let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
450
- debug ! ( "walk_chain({:?}): outer_expn={:?}" , span, outer_expn) ;
450
+ trace ! ( "walk_chain({:?}): outer_expn={:?}" , span, outer_expn) ;
451
451
let expn_data = self . expn_data ( outer_expn) ;
452
- debug ! ( "walk_chain({:?}): expn_data={:?}" , span, expn_data) ;
452
+ trace ! ( "walk_chain({:?}): expn_data={:?}" , span, expn_data) ;
453
453
span = expn_data. call_site ;
454
454
}
455
455
span
456
456
}
457
457
458
+ fn walk_chain_collapsed < F : Fn ( & HygieneData , Span ) -> bool > (
459
+ & self ,
460
+ mut span : Span ,
461
+ to : SyntaxContext ,
462
+ should_collapse : F ,
463
+ ) -> Span {
464
+ let orig_span = span;
465
+ trace ! ( "walk_chain_collapsed({:?}, {:?})" , span, to) ;
466
+ trace ! ( "walk_chain_collapsed: span ctxt = {:?}" , span. ctxt( ) ) ;
467
+ while span. ctxt ( ) != to && should_collapse ( & self , span) {
468
+ let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
469
+ trace ! ( "walk_chain_collapsed({:?}): outer_expn={:?}" , span, outer_expn) ;
470
+ let expn_data = self . expn_data ( outer_expn) ;
471
+ trace ! ( "walk_chain_collapsed({:?}): expn_data={:?}" , span, expn_data) ;
472
+ span = expn_data. call_site ;
473
+ }
474
+ trace ! ( "walk_chain_collapsed: for span {:?} >>> return span = {:?}" , orig_span, span) ;
475
+ span
476
+ }
477
+
458
478
fn adjust ( & self , ctxt : & mut SyntaxContext , expn_id : ExpnId ) -> Option < ExpnId > {
459
479
let mut scope = None ;
460
480
while !self . is_descendant_of ( expn_id, self . outer_expn ( * ctxt) ) {
@@ -568,9 +588,25 @@ impl HygieneData {
568
588
}
569
589
570
590
pub fn walk_chain ( span : Span , to : SyntaxContext ) -> Span {
591
+ debug ! ( "walk_chain call({:?}, {:?})" , span, to) ;
571
592
HygieneData :: with ( |data| data. walk_chain ( span, to) )
572
593
}
573
594
595
+ pub fn walk_chain_collapsed < F : Fn ( & HygieneData , Span ) -> bool > (
596
+ span : Span ,
597
+ to : SyntaxContext ,
598
+ should_collapse : F ,
599
+ ) -> Span {
600
+ debug ! ( "walk_chain_collapsed call({:?}, {:?})" , span, to) ;
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 { }
@@ -1279,7 +1315,7 @@ pub fn decode_expn_id(
1279
1315
decode_data : impl FnOnce ( ExpnId ) -> ( ExpnData , ExpnHash ) ,
1280
1316
) -> ExpnId {
1281
1317
if index == 0 {
1282
- trace ! ( "decode_expn_id: deserialized root" ) ;
1318
+ // trace!("decode_expn_id: deserialized root");
1283
1319
return ExpnId :: root ( ) ;
1284
1320
}
1285
1321
@@ -1312,7 +1348,7 @@ pub fn decode_syntax_context<D: Decoder, F: FnOnce(&mut D, u32) -> SyntaxContext
1312
1348
) -> SyntaxContext {
1313
1349
let raw_id: u32 = Decodable :: decode ( d) ;
1314
1350
if raw_id == 0 {
1315
- trace ! ( "decode_syntax_context: deserialized root" ) ;
1351
+ // trace!("decode_syntax_context: deserialized root");
1316
1352
// The root is special
1317
1353
return SyntaxContext :: root ( ) ;
1318
1354
}
0 commit comments