@@ -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) ;
@@ -1784,16 +1785,23 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
1784
1785
}
1785
1786
1786
1787
/// 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()" ) ;
1790
1793
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 ( ) } ;
1792
1796
tcx. hir ( ) . visit_all_item_likes ( & mut visitor) ;
1793
1797
1798
+ let mut all_traits = visitor. traits ;
1794
1799
let mut all_impls: Vec < _ > = visitor. impls . into_iter ( ) . collect ( ) ;
1795
1800
1796
1801
// 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
+ } ) ;
1797
1805
all_impls. sort_by_cached_key ( |& ( trait_def_id, _) | tcx. def_path_hash ( trait_def_id) ) ;
1798
1806
1799
1807
let all_impls: Vec < _ > = all_impls
@@ -1811,7 +1819,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
1811
1819
} )
1812
1820
. collect ( ) ;
1813
1821
1814
- self . lazy ( & all_impls)
1822
+ ( self . lazy ( & all_traits ) , self . lazy ( & all_impls) )
1815
1823
}
1816
1824
1817
1825
// Encodes all symbols exported from this crate into the metadata.
@@ -2033,27 +2041,34 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
2033
2041
}
2034
2042
}
2035
2043
2036
- struct ImplVisitor < ' tcx > {
2044
+ struct TraitsAndImplsVisitor < ' tcx > {
2037
2045
tcx : TyCtxt < ' tcx > ,
2046
+ traits : Vec < DefIndex > ,
2038
2047
impls : FxHashMap < DefId , Vec < ( DefIndex , Option < fast_reject:: SimplifiedType > ) > > ,
2039
2048
}
2040
2049
2041
- impl < ' tcx , ' v > ItemLikeVisitor < ' v > for ImplVisitor < ' tcx > {
2050
+ impl < ' tcx , ' v > ItemLikeVisitor < ' v > for TraitsAndImplsVisitor < ' tcx > {
2042
2051
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
+ ) ;
2051
2064
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
+ }
2056
2070
}
2071
+ _ => { }
2057
2072
}
2058
2073
}
2059
2074
0 commit comments