@@ -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+ /// Unspecified value
171+ Unspecified = 0 ,
172+ /// Don't collapse debuginfo for the macro
173+ No = 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,7 +499,8 @@ 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;
@@ -477,7 +513,10 @@ impl HygieneData {
477513 let expn_data = self . expn_data ( outer_expn) ;
478514 debug ! ( "walk_chain_collapsed({:?}): expn_data={:?}" , span, expn_data) ;
479515 span = expn_data. call_site ;
480- if !collapse_debuginfo_enabled || expn_data. collapse_debuginfo {
516+ let is_ext = !expn_data. macro_def_id . map_or ( false , |v| v. is_local ( ) ) ;
517+ if !collapse_debuginfo_feature_enabled
518+ || expn_data. collapse_debuginfo . should_collapse ( collapse_debuginfo_flag, is_ext)
519+ {
481520 ret_span = span;
482521 }
483522 }
@@ -601,8 +640,20 @@ pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
601640 HygieneData :: with ( |data| data. walk_chain ( span, to) )
602641}
603642
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) )
643+ pub fn walk_chain_collapsed (
644+ span : Span ,
645+ to : Span ,
646+ collapse_debuginfo_feature_enabled : bool ,
647+ collapse_debuginfo_flag : CollapseDebuginfo ,
648+ ) -> Span {
649+ HygieneData :: with ( |hdata| {
650+ hdata. walk_chain_collapsed (
651+ span,
652+ to,
653+ collapse_debuginfo_feature_enabled,
654+ collapse_debuginfo_flag,
655+ )
656+ } )
606657}
607658
608659pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
@@ -957,7 +1008,7 @@ pub struct ExpnData {
9571008 pub local_inner_macros : bool ,
9581009 /// Should debuginfo for the macro be collapsed to the outermost expansion site (in other
9591010 /// words, was the macro definition annotated with `#[collapse_debuginfo]`)?
960- pub ( crate ) collapse_debuginfo : bool ,
1011+ pub ( crate ) collapse_debuginfo : CollapseDebuginfo ,
9611012}
9621013
9631014impl !PartialEq for ExpnData { }
@@ -975,7 +1026,7 @@ impl ExpnData {
9751026 parent_module : Option < DefId > ,
9761027 allow_internal_unsafe : bool ,
9771028 local_inner_macros : bool ,
978- collapse_debuginfo : bool ,
1029+ collapse_debuginfo : CollapseDebuginfo ,
9791030 ) -> ExpnData {
9801031 ExpnData {
9811032 kind,
@@ -1013,7 +1064,7 @@ impl ExpnData {
10131064 disambiguator : 0 ,
10141065 allow_internal_unsafe : false ,
10151066 local_inner_macros : false ,
1016- collapse_debuginfo : false ,
1067+ collapse_debuginfo : CollapseDebuginfo :: Unspecified ,
10171068 }
10181069 }
10191070
0 commit comments