@@ -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) ;
@@ -1791,16 +1792,23 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
17911792 }
17921793
17931794 /// Encodes an index, mapping each trait to its (local) implementations.
1794- fn encode_impls ( & mut self ) -> Lazy < [ TraitImpls ] > {
1795- empty_proc_macro ! ( self ) ;
1796- debug ! ( "EncodeContext::encode_impls()" ) ;
1795+ fn encode_traits_and_impls ( & mut self ) -> ( Lazy < [ DefIndex ] > , Lazy < [ TraitImpls ] > ) {
1796+ if self . is_proc_macro {
1797+ return ( Lazy :: empty ( ) , Lazy :: empty ( ) ) ;
1798+ }
1799+ debug ! ( "EncodeContext::encode_traits_and_impls()" ) ;
17971800 let tcx = self . tcx ;
1798- let mut visitor = ImplVisitor { tcx, impls : FxHashMap :: default ( ) } ;
1801+ let mut visitor =
1802+ TraitsAndImplsVisitor { tcx, impls : FxHashMap :: default ( ) , traits : Default :: default ( ) } ;
17991803 tcx. hir ( ) . visit_all_item_likes ( & mut visitor) ;
18001804
1805+ let mut all_traits = visitor. traits ;
18011806 let mut all_impls: Vec < _ > = visitor. impls . into_iter ( ) . collect ( ) ;
18021807
18031808 // Bring everything into deterministic order for hashing
1809+ all_traits. sort_by_cached_key ( |& local_def_index| {
1810+ tcx. hir ( ) . def_path_hash ( LocalDefId { local_def_index } )
1811+ } ) ;
18041812 all_impls. sort_by_cached_key ( |& ( trait_def_id, _) | tcx. def_path_hash ( trait_def_id) ) ;
18051813
18061814 let all_impls: Vec < _ > = all_impls
@@ -1818,7 +1826,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
18181826 } )
18191827 . collect ( ) ;
18201828
1821- self . lazy ( & all_impls)
1829+ ( self . lazy ( & all_traits ) , self . lazy ( & all_impls) )
18221830 }
18231831
18241832 // Encodes all symbols exported from this crate into the metadata.
@@ -2040,27 +2048,34 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
20402048 }
20412049}
20422050
2043- struct ImplVisitor < ' tcx > {
2051+ struct TraitsAndImplsVisitor < ' tcx > {
20442052 tcx : TyCtxt < ' tcx > ,
2053+ traits : Vec < DefIndex > ,
20452054 impls : FxHashMap < DefId , Vec < ( DefIndex , Option < fast_reject:: SimplifiedType > ) > > ,
20462055}
20472056
2048- impl < ' tcx , ' v > ItemLikeVisitor < ' v > for ImplVisitor < ' tcx > {
2057+ impl < ' tcx , ' v > ItemLikeVisitor < ' v > for TraitsAndImplsVisitor < ' tcx > {
20492058 fn visit_item ( & mut self , item : & hir:: Item < ' _ > ) {
2050- if let hir:: ItemKind :: Impl { .. } = item. kind {
2051- if let Some ( trait_ref) = self . tcx . impl_trait_ref ( item. def_id . to_def_id ( ) ) {
2052- let simplified_self_ty = fast_reject:: simplify_type (
2053- self . tcx ,
2054- trait_ref. self_ty ( ) ,
2055- SimplifyParams :: No ,
2056- StripReferences :: No ,
2057- ) ;
2059+ match item. kind {
2060+ hir:: ItemKind :: Trait ( ..) | hir:: ItemKind :: TraitAlias ( ..) => {
2061+ self . traits . push ( item. def_id . local_def_index ) ;
2062+ }
2063+ hir:: ItemKind :: Impl ( ..) => {
2064+ if let Some ( trait_ref) = self . tcx . impl_trait_ref ( item. def_id . to_def_id ( ) ) {
2065+ let simplified_self_ty = fast_reject:: simplify_type (
2066+ self . tcx ,
2067+ trait_ref. self_ty ( ) ,
2068+ SimplifyParams :: No ,
2069+ StripReferences :: No ,
2070+ ) ;
20582071
2059- self . impls
2060- . entry ( trait_ref. def_id )
2061- . or_default ( )
2062- . push ( ( item. def_id . local_def_index , simplified_self_ty) ) ;
2072+ self . impls
2073+ . entry ( trait_ref. def_id )
2074+ . or_default ( )
2075+ . push ( ( item. def_id . local_def_index , simplified_self_ty) ) ;
2076+ }
20632077 }
2078+ _ => { }
20642079 }
20652080 }
20662081
0 commit comments