@@ -170,9 +170,13 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> {
170170 }
171171
172172 fn visit_variant_data ( & mut self , data : & ' a VariantData ) {
173+ // The assumption here is that non-`cfg` macro expansion cannot change field indices.
174+ // It currently holds because only inert attributes are accepted on fields,
175+ // and every such attribute expands into a single field after it's resolved.
173176 for ( index, field) in data. fields ( ) . iter ( ) . enumerate ( ) {
174177 if field. is_placeholder {
175178 self . visit_macro_invoc ( field. id ) ;
179+ self . definitions . placeholder_field_indices . insert ( field. id , index) ;
176180 continue ;
177181 }
178182 let name = field. ident . map ( |ident| ident. name )
@@ -338,12 +342,19 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> {
338342 }
339343 }
340344
345+ // This method is called only when we are visiting an individual field
346+ // after expanding an attribute on it.
341347 fn visit_struct_field ( & mut self , sf : & ' a StructField ) {
342348 if sf. is_placeholder {
343349 self . visit_macro_invoc ( sf. id )
344350 } else {
345- let name = sf. ident . map ( |ident| ident. name )
346- . unwrap_or_else ( || panic ! ( "don't know the field number in this context" ) ) ;
351+ let name = sf. ident . map_or_else (
352+ || {
353+ let expn_id = NodeId :: placeholder_from_expn_id ( self . expansion ) ;
354+ sym:: integer ( self . definitions . placeholder_field_indices [ & expn_id] )
355+ } ,
356+ |ident| ident. name ,
357+ ) ;
347358 let def = self . create_def ( sf. id ,
348359 DefPathData :: ValueNs ( name. as_interned_str ( ) ) ,
349360 sf. span ) ;
0 commit comments