@@ -291,7 +291,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
291291 // Unresolved macros produce dummy outputs as a recovery measure.
292292 invocations. reverse ( ) ;
293293 let mut expanded_fragments = Vec :: new ( ) ;
294- let mut derives : FxHashMap < ExpnId , Vec < _ > > = FxHashMap :: default ( ) ;
294+ let mut all_derive_placeholders : FxHashMap < ExpnId , Vec < _ > > = FxHashMap :: default ( ) ;
295295 let mut undetermined_invocations = Vec :: new ( ) ;
296296 let ( mut progress, mut force) = ( false , !self . monotonic ) ;
297297 loop {
@@ -347,13 +347,14 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
347347
348348 let mut item = self . fully_configure ( item) ;
349349 item. visit_attrs ( |attrs| attrs. retain ( |a| a. path != sym:: derive) ) ;
350- let derives = derives. entry ( invoc. expansion_data . id ) . or_default ( ) ;
350+ let derive_placeholders =
351+ all_derive_placeholders. entry ( invoc. expansion_data . id ) . or_default ( ) ;
351352
352- derives . reserve ( traits. len ( ) ) ;
353+ derive_placeholders . reserve ( traits. len ( ) ) ;
353354 invocations. reserve ( traits. len ( ) ) ;
354355 for path in traits {
355356 let expn_id = ExpnId :: fresh ( None ) ;
356- derives . push ( expn_id) ;
357+ derive_placeholders . push ( NodeId :: placeholder_from_expn_id ( expn_id) ) ;
357358 invocations. push ( Invocation {
358359 kind : InvocationKind :: Derive { path, item : item. clone ( ) } ,
359360 fragment_kind : invoc. fragment_kind ,
@@ -365,7 +366,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
365366 }
366367 let fragment = invoc. fragment_kind
367368 . expect_from_annotatables ( :: std:: iter:: once ( item) ) ;
368- self . collect_invocations ( fragment, derives )
369+ self . collect_invocations ( fragment, derive_placeholders )
369370 } else {
370371 unreachable ! ( )
371372 } ;
@@ -384,10 +385,11 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
384385 // Finally incorporate all the expanded macros into the input AST fragment.
385386 let mut placeholder_expander = PlaceholderExpander :: new ( self . cx , self . monotonic ) ;
386387 while let Some ( expanded_fragments) = expanded_fragments. pop ( ) {
387- for ( mark, expanded_fragment) in expanded_fragments. into_iter ( ) . rev ( ) {
388- let derives = derives. remove ( & mark) . unwrap_or_else ( Vec :: new) ;
389- placeholder_expander. add ( NodeId :: placeholder_from_expn_id ( mark) ,
390- expanded_fragment, derives) ;
388+ for ( expn_id, expanded_fragment) in expanded_fragments. into_iter ( ) . rev ( ) {
389+ let derive_placeholders =
390+ all_derive_placeholders. remove ( & expn_id) . unwrap_or_else ( Vec :: new) ;
391+ placeholder_expander. add ( NodeId :: placeholder_from_expn_id ( expn_id) ,
392+ expanded_fragment, derive_placeholders) ;
391393 }
392394 }
393395 fragment_with_placeholders. mut_visit_with ( & mut placeholder_expander) ;
@@ -404,7 +406,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
404406 /// them with "placeholders" - dummy macro invocations with specially crafted `NodeId`s.
405407 /// Then call into resolver that builds a skeleton ("reduced graph") of the fragment and
406408 /// prepares data for resolving paths of macro invocations.
407- fn collect_invocations ( & mut self , mut fragment : AstFragment , derives : & [ ExpnId ] )
409+ fn collect_invocations ( & mut self , mut fragment : AstFragment , extra_placeholders : & [ NodeId ] )
408410 -> ( AstFragment , Vec < Invocation > ) {
409411 // Resolve `$crate`s in the fragment for pretty-printing.
410412 self . cx . resolver . resolve_dollar_crates ( ) ;
@@ -423,9 +425,10 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
423425 collector. invocations
424426 } ;
425427
428+ // FIXME: Merge `extra_placeholders` into the `fragment` as regular placeholders.
426429 if self . monotonic {
427430 self . cx . resolver . visit_ast_fragment_with_placeholders (
428- self . cx . current_expansion . id , & fragment, derives ) ;
431+ self . cx . current_expansion . id , & fragment, extra_placeholders ) ;
429432 }
430433
431434 ( fragment, invocations)
0 commit comments