@@ -614,8 +614,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
614
614
615
615
// Encode the def IDs of impls, for coherence checking.
616
616
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;
619
619
620
620
let tcx = self . tcx ;
621
621
@@ -727,6 +727,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
727
727
foreign_modules,
728
728
source_map,
729
729
impls,
730
+ traits,
730
731
exported_symbols,
731
732
interpret_alloc_index,
732
733
tables,
@@ -753,7 +754,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
753
754
eprintln ! ( " diagnostic item bytes: {}" , diagnostic_item_bytes) ;
754
755
eprintln ! ( " native bytes: {}" , native_lib_bytes) ;
755
756
eprintln ! ( " source_map bytes: {}" , source_map_bytes) ;
756
- eprintln ! ( " impl bytes: {}" , impl_bytes ) ;
757
+ eprintln ! ( "traits and impls bytes: {}" , traits_and_impls_bytes ) ;
757
758
eprintln ! ( " exp. symbols bytes: {}" , exported_symbols_bytes) ;
758
759
eprintln ! ( " def-path table bytes: {}" , def_path_table_bytes) ;
759
760
eprintln ! ( " def-path hashes bytes: {}" , def_path_hash_map_bytes) ;
@@ -1791,16 +1792,23 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
1791
1792
}
1792
1793
1793
1794
/// 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()" ) ;
1797
1800
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 ( ) } ;
1799
1803
tcx. hir ( ) . visit_all_item_likes ( & mut visitor) ;
1800
1804
1805
+ let mut all_traits = visitor. traits ;
1801
1806
let mut all_impls: Vec < _ > = visitor. impls . into_iter ( ) . collect ( ) ;
1802
1807
1803
1808
// 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
+ } ) ;
1804
1812
all_impls. sort_by_cached_key ( |& ( trait_def_id, _) | tcx. def_path_hash ( trait_def_id) ) ;
1805
1813
1806
1814
let all_impls: Vec < _ > = all_impls
@@ -1818,7 +1826,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
1818
1826
} )
1819
1827
. collect ( ) ;
1820
1828
1821
- self . lazy ( & all_impls)
1829
+ ( self . lazy ( & all_traits ) , self . lazy ( & all_impls) )
1822
1830
}
1823
1831
1824
1832
// Encodes all symbols exported from this crate into the metadata.
@@ -2040,27 +2048,34 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
2040
2048
}
2041
2049
}
2042
2050
2043
- struct ImplVisitor < ' tcx > {
2051
+ struct TraitsAndImplsVisitor < ' tcx > {
2044
2052
tcx : TyCtxt < ' tcx > ,
2053
+ traits : Vec < DefIndex > ,
2045
2054
impls : FxHashMap < DefId , Vec < ( DefIndex , Option < fast_reject:: SimplifiedType > ) > > ,
2046
2055
}
2047
2056
2048
- impl < ' tcx , ' v > ItemLikeVisitor < ' v > for ImplVisitor < ' tcx > {
2057
+ impl < ' tcx , ' v > ItemLikeVisitor < ' v > for TraitsAndImplsVisitor < ' tcx > {
2049
2058
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
+ ) ;
2058
2071
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
+ }
2063
2077
}
2078
+ _ => { }
2064
2079
}
2065
2080
}
2066
2081
0 commit comments