@@ -143,26 +143,27 @@ impl MultiItemModifier for DeriveProcMacro {
143143            let  invoc_id = ecx. current_expansion . id ; 
144144            let  invoc_expn_data = invoc_id. expn_data ( ) ; 
145145
146-             // FIXME(pr-time): Just using the crate hash to notice when the proc-macro code has 
147-             // changed. How to *correctly* depend on exactly the macro definition? 
148-             // I.e., depending on the crate hash is just a HACK, and ideally the dependency would be 
149-             // more narrow. 
150-             let  macro_def_id = invoc_expn_data. macro_def_id . unwrap ( ) ; 
151-             let  proc_macro_crate_hash = tcx. crate_hash ( macro_def_id. krate ) ; 
152- 
153146            assert_eq ! ( invoc_expn_data. call_site,  span) ; 
154147
155-             let  key = ( invoc_id,  proc_macro_crate_hash,  input) ; 
156- 
157148            // FIXME(pr-time): Is this the correct way to check for incremental compilation (as 
158-             // well)? 
149+             // well as for `cache_proc_macros` )? 
159150            if  tcx. sess . opts . incremental . is_some ( )  && tcx. sess . opts . unstable_opts . cache_proc_macros 
160151            { 
152+                 // FIXME(pr-time): Just using the crate hash to notice when the proc-macro code has 
153+                 // changed. How to *correctly* depend on exactly the macro definition? 
154+                 // I.e., depending on the crate hash is just a HACK, and ideally the dependency would be 
155+                 // more narrow. 
156+                 let  macro_def_id = invoc_expn_data. macro_def_id . unwrap ( ) ; 
157+                 let  proc_macro_crate_hash = tcx. crate_hash ( macro_def_id. krate ) ; 
158+ 
159+                 let  key = ( invoc_id,  proc_macro_crate_hash,  input) ; 
160+ 
161161                enter_context ( ( ecx,  self . client ) ,  move  || tcx. derive_macro_expansion ( key) . cloned ( ) ) 
162162            }  else  { 
163-                 provide_derive_macro_expansion ( tcx,  key ) . cloned ( ) 
163+                 expand_derive_macro ( tcx,  invoc_id ,  input ,  ecx ,   self . client ) . cloned ( ) 
164164            } 
165165        } ) ; 
166+ 
166167        let  Ok ( output)  = res else  { 
167168            // error will already have been emitted 
168169            return  ExpandResult :: Ready ( vec ! [ ] ) ; 
@@ -204,40 +205,48 @@ pub(super) fn provide_derive_macro_expansion<'tcx>(
204205)  -> Result < & ' tcx  TokenStream ,  ( ) >  { 
205206    let  ( invoc_id,  _macro_crate_hash,  input)  = key; 
206207
207-     with_context ( |( ecx,  client) | { 
208-         let  invoc_expn_data = invoc_id. expn_data ( ) ; 
209-         let  span = invoc_expn_data. call_site ; 
210-         let  event_arg = invoc_expn_data. kind . descr ( ) ; 
211-         let  _timer = tcx. sess . prof . generic_activity_with_arg_recorder ( 
212-             "expand_derive_proc_macro_inner" , 
213-             |recorder| { 
214-                 recorder. record_arg_with_span ( tcx. sess . source_map ( ) ,  event_arg. clone ( ) ,  span) ; 
215-             } , 
216-         ) ; 
217- 
218-         let  proc_macro_backtrace = ecx. ecfg . proc_macro_backtrace ; 
219-         let  strategy = crate :: proc_macro:: exec_strategy ( tcx. sess ) ; 
220-         let  server = crate :: proc_macro_server:: Rustc :: new ( ecx) ; 
221- 
222-         match  client. run ( & strategy,  server,  input. clone ( ) ,  proc_macro_backtrace)  { 
223-             Ok ( stream)  => Ok ( tcx. arena . alloc ( stream)  as  & TokenStream ) , 
224-             Err ( e)  => { 
225-                 tcx. dcx ( ) . emit_err ( { 
226-                     errors:: ProcMacroDerivePanicked  { 
227-                         span, 
228-                         message :  e. as_str ( ) . map ( |message| errors:: ProcMacroDerivePanickedHelp  { 
229-                             message :  message. into ( ) , 
230-                         } ) , 
231-                     } 
232-                 } ) ; 
233-                 Err ( ( ) ) 
234-             } 
235-         } 
236-     } ) 
208+     with_context ( |( ecx,  client) | expand_derive_macro ( tcx,  invoc_id,  input,  ecx,  * client) ) 
237209} 
238210
239211type  CLIENT  = pm:: bridge:: client:: Client < pm:: TokenStream ,  pm:: TokenStream > ; 
240212
213+ fn  expand_derive_macro < ' tcx > ( 
214+     tcx :  TyCtxt < ' tcx > , 
215+     invoc_id :  LocalExpnId , 
216+     input :  & ' tcx  TokenStream , 
217+     ecx :  & mut  ExtCtxt < ' _ > , 
218+     client :  CLIENT , 
219+ )  -> Result < & ' tcx  TokenStream ,  ( ) >  { 
220+     let  invoc_expn_data = invoc_id. expn_data ( ) ; 
221+     let  span = invoc_expn_data. call_site ; 
222+     let  event_arg = invoc_expn_data. kind . descr ( ) ; 
223+     let  _timer = tcx. sess . prof . generic_activity_with_arg_recorder ( 
224+         "expand_derive_proc_macro_inner" , 
225+         |recorder| { 
226+             recorder. record_arg_with_span ( tcx. sess . source_map ( ) ,  event_arg. clone ( ) ,  span) ; 
227+         } , 
228+     ) ; 
229+ 
230+     let  proc_macro_backtrace = ecx. ecfg . proc_macro_backtrace ; 
231+     let  strategy = crate :: proc_macro:: exec_strategy ( tcx. sess ) ; 
232+     let  server = crate :: proc_macro_server:: Rustc :: new ( ecx) ; 
233+ 
234+     match  client. run ( & strategy,  server,  input. clone ( ) ,  proc_macro_backtrace)  { 
235+         Ok ( stream)  => Ok ( tcx. arena . alloc ( stream)  as  & TokenStream ) , 
236+         Err ( e)  => { 
237+             tcx. dcx ( ) . emit_err ( { 
238+                 errors:: ProcMacroDerivePanicked  { 
239+                     span, 
240+                     message :  e. as_str ( ) . map ( |message| errors:: ProcMacroDerivePanickedHelp  { 
241+                         message :  message. into ( ) , 
242+                     } ) , 
243+                 } 
244+             } ) ; 
245+             Err ( ( ) ) 
246+         } 
247+     } 
248+ } 
249+ 
241250// based on rust/compiler/rustc_middle/src/ty/context/tls.rs 
242251thread_local !  { 
243252    /// A thread local variable that stores a pointer to the current `CONTEXT`. 
0 commit comments