@@ -163,6 +163,41 @@ pub enum Transparency {
163163Opaque , 
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. 
168203pub  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 {
9571011pub  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