@@ -29,7 +29,6 @@ use rustc_middle::metadata::ModChild;
2929use rustc_middle:: { bug, ty} ;
3030use rustc_session:: cstore:: CrateStore ;
3131use rustc_span:: hygiene:: { ExpnId , LocalExpnId , MacroKind } ;
32- use rustc_span:: source_map:: respan;
3332use rustc_span:: symbol:: { kw, sym, Ident , Symbol } ;
3433use rustc_span:: Span ;
3534
@@ -327,13 +326,13 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
327326 }
328327 }
329328
330- fn insert_field_names_local ( & mut self , def_id : DefId , vdata : & ast:: VariantData ) {
331- let field_names = vdata
332- . fields ( )
333- . iter ( )
334- . map ( |field| respan ( field . span , field . ident . map_or ( kw :: Empty , |ident| ident . name ) ) )
335- . collect ( ) ;
336- self . r . field_names . insert ( def_id, field_names ) ;
329+ fn insert_field_def_ids ( & mut self , def_id : LocalDefId , vdata : & ast:: VariantData ) {
330+ if vdata . fields ( ) . iter ( ) . any ( |field| field . is_placeholder ) {
331+ // The fields are not expanded yet.
332+ return ;
333+ }
334+ let def_ids = vdata . fields ( ) . iter ( ) . map ( |field| self . r . local_def_id ( field . id ) . to_def_id ( ) ) ;
335+ self . r . field_def_ids . insert ( def_id, self . r . tcx . arena . alloc_from_iter ( def_ids ) ) ;
337336 }
338337
339338 fn insert_field_visibilities_local ( & mut self , def_id : DefId , vdata : & ast:: VariantData ) {
@@ -345,12 +344,6 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
345344 self . r . field_visibility_spans . insert ( def_id, field_vis) ;
346345 }
347346
348- fn insert_field_names_extern ( & mut self , def_id : DefId ) {
349- let field_names =
350- self . r . cstore ( ) . struct_field_names_untracked ( def_id, self . r . tcx . sess ) . collect ( ) ;
351- self . r . field_names . insert ( def_id, field_names) ;
352- }
353-
354347 fn block_needs_anonymous_module ( & mut self , block : & Block ) -> bool {
355348 // If any statements are items, we need to create an anonymous module
356349 block
@@ -748,7 +741,7 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
748741 self . r . define ( parent, ident, TypeNS , ( res, vis, sp, expansion) ) ;
749742
750743 // Record field names for error reporting.
751- self . insert_field_names_local ( def_id , vdata) ;
744+ self . insert_field_def_ids ( local_def_id , vdata) ;
752745 self . insert_field_visibilities_local ( def_id, vdata) ;
753746
754747 // If this is a tuple or unit struct, define a name
@@ -797,7 +790,7 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
797790 self . r . define ( parent, ident, TypeNS , ( res, vis, sp, expansion) ) ;
798791
799792 // Record field names for error reporting.
800- self . insert_field_names_local ( def_id , vdata) ;
793+ self . insert_field_def_ids ( local_def_id , vdata) ;
801794 self . insert_field_visibilities_local ( def_id, vdata) ;
802795 }
803796
@@ -1003,12 +996,6 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
1003996 | Res :: SelfCtor ( ..)
1004997 | Res :: Err => bug ! ( "unexpected resolution: {:?}" , res) ,
1005998 }
1006- // Record some extra data for better diagnostics.
1007- match res {
1008- Res :: Def ( DefKind :: Struct , def_id) => self . insert_field_names_extern ( def_id) ,
1009- Res :: Def ( DefKind :: Union , def_id) => self . insert_field_names_extern ( def_id) ,
1010- _ => { }
1011- }
1012999 }
10131000
10141001 fn add_macro_use_binding (
@@ -1519,7 +1506,7 @@ impl<'a, 'b, 'tcx> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b, 'tcx> {
15191506 }
15201507
15211508 // Record field names for error reporting.
1522- self . insert_field_names_local ( def_id. to_def_id ( ) , & variant. data ) ;
1509+ self . insert_field_def_ids ( def_id, & variant. data ) ;
15231510 self . insert_field_visibilities_local ( def_id. to_def_id ( ) , & variant. data ) ;
15241511
15251512 visit:: walk_variant ( self , variant) ;
0 commit comments