@@ -614,8 +614,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
614614
615615 // Encode the def IDs of impls, for coherence checking.
616616 i = self . position ( ) ;
617- let impls = self . encode_impls ( ) ;
618- let impl_bytes = self . position ( ) - i;
617+ let ( traits , impls) = self . encode_traits_and_impls ( ) ;
618+ let traits_and_impls_bytes = self . position ( ) - i;
619619
620620 let tcx = self . tcx ;
621621
@@ -727,6 +727,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
727727 foreign_modules,
728728 source_map,
729729 impls,
730+ traits,
730731 exported_symbols,
731732 interpret_alloc_index,
732733 tables,
@@ -753,7 +754,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
753754 eprintln ! ( " diagnostic item bytes: {}" , diagnostic_item_bytes) ;
754755 eprintln ! ( " native bytes: {}" , native_lib_bytes) ;
755756 eprintln ! ( " source_map bytes: {}" , source_map_bytes) ;
756- eprintln ! ( " impl bytes: {}" , impl_bytes ) ;
757+ eprintln ! ( "traits and impls bytes: {}" , traits_and_impls_bytes ) ;
757758 eprintln ! ( " exp. symbols bytes: {}" , exported_symbols_bytes) ;
758759 eprintln ! ( " def-path table bytes: {}" , def_path_table_bytes) ;
759760 eprintln ! ( " def-path hashes bytes: {}" , def_path_hash_map_bytes) ;
@@ -1784,16 +1785,23 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
17841785 }
17851786
17861787 /// Encodes an index, mapping each trait to its (local) implementations.
1787- fn encode_impls ( & mut self ) -> Lazy < [ TraitImpls ] > {
1788- empty_proc_macro ! ( self ) ;
1789- debug ! ( "EncodeContext::encode_impls()" ) ;
1788+ fn encode_traits_and_impls ( & mut self ) -> ( Lazy < [ DefIndex ] > , Lazy < [ TraitImpls ] > ) {
1789+ if self . is_proc_macro {
1790+ return ( Lazy :: empty ( ) , Lazy :: empty ( ) ) ;
1791+ }
1792+ debug ! ( "EncodeContext::encode_traits_and_impls()" ) ;
17901793 let tcx = self . tcx ;
1791- let mut visitor = ImplVisitor { tcx, impls : FxHashMap :: default ( ) } ;
1794+ let mut visitor =
1795+ TraitsAndImplsVisitor { tcx, impls : FxHashMap :: default ( ) , traits : Default :: default ( ) } ;
17921796 tcx. hir ( ) . visit_all_item_likes ( & mut visitor) ;
17931797
1798+ let mut all_traits = visitor. traits ;
17941799 let mut all_impls: Vec < _ > = visitor. impls . into_iter ( ) . collect ( ) ;
17951800
17961801 // Bring everything into deterministic order for hashing
1802+ all_traits. sort_by_cached_key ( |& local_def_index| {
1803+ tcx. hir ( ) . def_path_hash ( LocalDefId { local_def_index } )
1804+ } ) ;
17971805 all_impls. sort_by_cached_key ( |& ( trait_def_id, _) | tcx. def_path_hash ( trait_def_id) ) ;
17981806
17991807 let all_impls: Vec < _ > = all_impls
@@ -1811,7 +1819,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
18111819 } )
18121820 . collect ( ) ;
18131821
1814- self . lazy ( & all_impls)
1822+ ( self . lazy ( & all_traits ) , self . lazy ( & all_impls) )
18151823 }
18161824
18171825 // Encodes all symbols exported from this crate into the metadata.
@@ -2033,27 +2041,34 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
20332041 }
20342042}
20352043
2036- struct ImplVisitor < ' tcx > {
2044+ struct TraitsAndImplsVisitor < ' tcx > {
20372045 tcx : TyCtxt < ' tcx > ,
2046+ traits : Vec < DefIndex > ,
20382047 impls : FxHashMap < DefId , Vec < ( DefIndex , Option < fast_reject:: SimplifiedType > ) > > ,
20392048}
20402049
2041- impl < ' tcx , ' v > ItemLikeVisitor < ' v > for ImplVisitor < ' tcx > {
2050+ impl < ' tcx , ' v > ItemLikeVisitor < ' v > for TraitsAndImplsVisitor < ' tcx > {
20422051 fn visit_item ( & mut self , item : & hir:: Item < ' _ > ) {
2043- if let hir:: ItemKind :: Impl { .. } = item. kind {
2044- if let Some ( trait_ref) = self . tcx . impl_trait_ref ( item. def_id . to_def_id ( ) ) {
2045- let simplified_self_ty = fast_reject:: simplify_type (
2046- self . tcx ,
2047- trait_ref. self_ty ( ) ,
2048- SimplifyParams :: No ,
2049- StripReferences :: No ,
2050- ) ;
2052+ match item. kind {
2053+ hir:: ItemKind :: Trait ( ..) | hir:: ItemKind :: TraitAlias ( ..) => {
2054+ self . traits . push ( item. def_id . local_def_index ) ;
2055+ }
2056+ hir:: ItemKind :: Impl ( ..) => {
2057+ if let Some ( trait_ref) = self . tcx . impl_trait_ref ( item. def_id . to_def_id ( ) ) {
2058+ let simplified_self_ty = fast_reject:: simplify_type (
2059+ self . tcx ,
2060+ trait_ref. self_ty ( ) ,
2061+ SimplifyParams :: No ,
2062+ StripReferences :: No ,
2063+ ) ;
20512064
2052- self . impls
2053- . entry ( trait_ref. def_id )
2054- . or_default ( )
2055- . push ( ( item. def_id . local_def_index , simplified_self_ty) ) ;
2065+ self . impls
2066+ . entry ( trait_ref. def_id )
2067+ . or_default ( )
2068+ . push ( ( item. def_id . local_def_index , simplified_self_ty) ) ;
2069+ }
20562070 }
2071+ _ => { }
20572072 }
20582073 }
20592074
0 commit comments