@@ -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,25 @@ 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 ! ( "walk_chain_collapsed({:?}, {:?}), feature_enable={}, cmd_flag={:?}" ,
509+ span, to, collapse_debuginfo_feature_enabled, collapse_debuginfo_flag) ;
473510 debug ! ( "walk_chain_collapsed: span ctxt = {:?}" , span. ctxt( ) ) ;
474511 while !span. eq_ctxt ( to) && span. from_expansion ( ) {
475512 let outer_expn = self . outer_expn ( span. ctxt ( ) ) ;
476513 debug ! ( "walk_chain_collapsed({:?}): outer_expn={:?}" , span, outer_expn) ;
477514 let expn_data = self . expn_data ( outer_expn) ;
478515 debug ! ( "walk_chain_collapsed({:?}): expn_data={:?}" , span, expn_data) ;
479516 span = expn_data. call_site ;
480- if !collapse_debuginfo_enabled || expn_data. collapse_debuginfo {
517+ let is_ext = !expn_data. macro_def_id . map_or ( false , |v| v. is_local ( ) ) ;
518+ if !collapse_debuginfo_feature_enabled
519+ || expn_data. collapse_debuginfo . should_collapse ( collapse_debuginfo_flag, is_ext)
520+ {
481521 ret_span = span;
482522 }
483523 }
@@ -601,8 +641,20 @@ pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
601641 HygieneData :: with ( |data| data. walk_chain ( span, to) )
602642}
603643
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) )
644+ pub fn walk_chain_collapsed (
645+ span : Span ,
646+ to : Span ,
647+ collapse_debuginfo_feature_enabled : bool ,
648+ collapse_debuginfo_flag : CollapseDebuginfo ,
649+ ) -> Span {
650+ HygieneData :: with ( |hdata| {
651+ hdata. walk_chain_collapsed (
652+ span,
653+ to,
654+ collapse_debuginfo_feature_enabled,
655+ collapse_debuginfo_flag,
656+ )
657+ } )
606658}
607659
608660pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
@@ -957,7 +1009,7 @@ pub struct ExpnData {
9571009 pub local_inner_macros : bool ,
9581010 /// Should debuginfo for the macro be collapsed to the outermost expansion site (in other
9591011 /// words, was the macro definition annotated with `#[collapse_debuginfo]`)?
960- pub ( crate ) collapse_debuginfo : bool ,
1012+ pub ( crate ) collapse_debuginfo : CollapseDebuginfo ,
9611013}
9621014
9631015impl !PartialEq for ExpnData { }
@@ -975,7 +1027,7 @@ impl ExpnData {
9751027 parent_module : Option < DefId > ,
9761028 allow_internal_unsafe : bool ,
9771029 local_inner_macros : bool ,
978- collapse_debuginfo : bool ,
1030+ collapse_debuginfo : CollapseDebuginfo ,
9791031 ) -> ExpnData {
9801032 ExpnData {
9811033 kind,
@@ -1013,7 +1065,7 @@ impl ExpnData {
10131065 disambiguator : 0 ,
10141066 allow_internal_unsafe : false ,
10151067 local_inner_macros : false ,
1016- collapse_debuginfo : false ,
1068+ collapse_debuginfo : CollapseDebuginfo :: Unspecified ,
10171069 }
10181070 }
10191071
0 commit comments