@@ -163,6 +163,41 @@ pub enum Transparency {
163163 Opaque ,
164164}
165165
166+ /// How to perform collapse macros debug info
167+ #[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Hash , Debug , Encodable , Decodable ) ]
168+ #[ derive( HashStable_Generic ) ]
169+ pub enum CollapseDebuginfo {
170+ /// Don't collapse debuginfo for the macro
171+ No = 0 ,
172+ /// Unspecified value
173+ Unspecified = 1 ,
174+ /// Collapse debuginfo if command line flag enables collapsing
175+ External = 2 ,
176+ /// Collapse debuginfo for the macro
177+ Yes = 3 ,
178+ }
179+
180+ /// if-ext - if macro from different crate (related to callsite code)
181+ /// | cmd \ attr | no | (unspecified) | external | yes |
182+ /// | no | no | no | no | no |
183+ /// | (unspecified) | no | no | if-ext | yes |
184+ /// | external | no | if-ext | if-ext | yes |
185+ /// | yes | yes | yes | yes | yes |
186+ impl CollapseDebuginfo {
187+ pub fn should_collapse ( self , flag : CollapseDebuginfo , ext : bool ) -> bool {
188+ const NO : bool = false ;
189+ const YES : bool = true ;
190+ #[ rustfmt:: skip]
191+ let collapse_table = [
192+ [ NO , NO , NO , NO ] ,
193+ [ NO , NO , ext, YES ] ,
194+ [ NO , ext, ext, YES ] ,
195+ [ YES , YES , YES , YES ] ,
196+ ] ;
197+ collapse_table[ flag as usize ] [ self as usize ]
198+ }
199+ }
200+
166201impl LocalExpnId {
167202 /// The ID of the theoretical expansion that generates freshly parsed, unexpanded AST.
168203 pub const ROOT : LocalExpnId = LocalExpnId :: from_u32 ( 0 ) ;
@@ -464,20 +499,27 @@ impl HygieneData {
464499 & self ,
465500 mut span : Span ,
466501 to : Span ,
467- collapse_debuginfo_enabled : bool ,
502+ collapse_debuginfo_feature_enabled : bool ,
503+ collapse_debuginfo_flag : CollapseDebuginfo ,
468504 ) -> Span {
469505 let orig_span = span;
470506 let mut ret_span = span;
471507
472- debug ! ( "walk_chain_collapsed({:?}, {:?})" , span, to) ;
508+ debug ! (
509+ "walk_chain_collapsed({:?}, {:?}), feature_enable={}, cmd_flag={:?}" ,
510+ span, to, collapse_debuginfo_feature_enabled, collapse_debuginfo_flag
511+ ) ;
473512 debug ! ( "walk_chain_collapsed: span ctxt = {:?}" , span. ctxt( ) ) ;
474513 while !span. eq_ctxt ( to) && span. from_expansion ( ) {
475514 let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
476515 debug ! ( "walk_chain_collapsed({:?}): outer_expn={:?}" , span, outer_expn) ;
477516 let expn_data = self . expn_data ( outer_expn) ;
478517 debug ! ( "walk_chain_collapsed({:?}): expn_data={:?}" , span, expn_data) ;
479518 span = expn_data. call_site ;
480- if !collapse_debuginfo_enabled || expn_data. collapse_debuginfo {
519+ let is_ext = !expn_data. macro_def_id . map_or ( false , |v| v. is_local ( ) ) ;
520+ if !collapse_debuginfo_feature_enabled
521+ || expn_data. collapse_debuginfo . should_collapse ( collapse_debuginfo_flag, is_ext)
522+ {
481523 ret_span = span;
482524 }
483525 }
@@ -601,8 +643,20 @@ pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
601643 HygieneData :: with ( |data| data. walk_chain ( span, to) )
602644}
603645
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) )
646+ pub fn walk_chain_collapsed (
647+ span : Span ,
648+ to : Span ,
649+ collapse_debuginfo_feature_enabled : bool ,
650+ collapse_debuginfo_flag : CollapseDebuginfo ,
651+ ) -> Span {
652+ HygieneData :: with ( |hdata| {
653+ hdata. walk_chain_collapsed (
654+ span,
655+ to,
656+ collapse_debuginfo_feature_enabled,
657+ collapse_debuginfo_flag,
658+ )
659+ } )
606660}
607661
608662pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
@@ -957,7 +1011,7 @@ pub struct ExpnData {
9571011 pub local_inner_macros : bool ,
9581012 /// Should debuginfo for the macro be collapsed to the outermost expansion site (in other
9591013 /// words, was the macro definition annotated with `#[collapse_debuginfo]`)?
960- pub ( crate ) collapse_debuginfo : bool ,
1014+ pub ( crate ) collapse_debuginfo : CollapseDebuginfo ,
9611015}
9621016
9631017impl !PartialEq for ExpnData { }
@@ -975,7 +1029,7 @@ impl ExpnData {
9751029 parent_module : Option < DefId > ,
9761030 allow_internal_unsafe : bool ,
9771031 local_inner_macros : bool ,
978- collapse_debuginfo : bool ,
1032+ collapse_debuginfo : CollapseDebuginfo ,
9791033 ) -> ExpnData {
9801034 ExpnData {
9811035 kind,
@@ -1013,7 +1067,7 @@ impl ExpnData {
10131067 disambiguator : 0 ,
10141068 allow_internal_unsafe : false ,
10151069 local_inner_macros : false ,
1016- collapse_debuginfo : false ,
1070+ collapse_debuginfo : CollapseDebuginfo :: Unspecified ,
10171071 }
10181072 }
10191073
0 commit comments