@@ -150,8 +150,9 @@ impl<'a, 'tcx, 'v> Visitor<'v> for CollectItemTypesVisitor<'a, 'tcx> {
150
150
intravisit:: walk_ty ( self , ty) ;
151
151
}
152
152
153
- fn visit_impl_item ( & mut self , _impl_item : & hir:: ImplItem ) {
153
+ fn visit_impl_item ( & mut self , impl_item : & hir:: ImplItem ) {
154
154
// handled in `visit_item` above; we may want to break this out later
155
+ intravisit:: walk_impl_item ( self , impl_item) ;
155
156
}
156
157
}
157
158
@@ -782,43 +783,10 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
782
783
entry. insert ( impl_item. span ) ;
783
784
}
784
785
}
785
-
786
- if let hir:: ImplItemKind :: Const ( ref ty, _) = impl_item. node {
787
- let const_def_id = ccx. tcx . map . local_def_id ( impl_item. id ) ;
788
- generics_of_def_id ( ccx, const_def_id) ;
789
- let ty = ccx. icx ( & ty_predicates)
790
- . to_ty ( & ExplicitRscope , & ty) ;
791
- tcx. item_types . borrow_mut ( ) . insert ( const_def_id, ty) ;
792
- convert_associated_const ( ccx, ImplContainer ( def_id) ,
793
- impl_item. id , ty) ;
794
- }
795
- }
796
-
797
- // Convert all the associated types.
798
- for & impl_item_id in impl_item_ids {
799
- let impl_item = tcx. map . impl_item ( impl_item_id) ;
800
- if let hir:: ImplItemKind :: Type ( ref ty) = impl_item. node {
801
- let type_def_id = ccx. tcx . map . local_def_id ( impl_item. id ) ;
802
- generics_of_def_id ( ccx, type_def_id) ;
803
-
804
- if opt_trait_ref. is_none ( ) {
805
- span_err ! ( tcx. sess, impl_item. span, E0202 ,
806
- "associated types are not allowed in inherent impls" ) ;
807
- }
808
-
809
- let typ = ccx. icx ( & ty_predicates) . to_ty ( & ExplicitRscope , ty) ;
810
-
811
- convert_associated_type ( ccx, ImplContainer ( def_id) , impl_item. id , Some ( typ) ) ;
812
- }
813
786
}
814
787
815
788
for & impl_item_id in impl_item_ids {
816
- let impl_item = tcx. map . impl_item ( impl_item_id) ;
817
- if let hir:: ImplItemKind :: Method ( ref sig, _) = impl_item. node {
818
- convert_method ( ccx, ImplContainer ( def_id) ,
819
- impl_item. id , sig, selfty,
820
- & ty_predicates) ;
821
- }
789
+ convert_impl_item ( ccx, impl_item_id) ;
822
790
}
823
791
824
792
enforce_impl_lifetimes_are_constrained ( ccx, generics, def_id, impl_item_ids) ;
@@ -907,6 +875,47 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
907
875
}
908
876
}
909
877
878
+ fn convert_impl_item ( ccx : & CrateCtxt , impl_item_id : hir:: ImplItemId ) {
879
+ let tcx = ccx. tcx ;
880
+ let impl_item = tcx. map . impl_item ( impl_item_id) ;
881
+ let impl_def_id = tcx. map . get_parent_did ( impl_item_id. id ) ;
882
+ let impl_predicates = tcx. item_predicates ( impl_def_id) ;
883
+ let impl_trait_ref = tcx. impl_trait_ref ( impl_def_id) ;
884
+ let impl_self_ty = tcx. item_type ( impl_def_id) ;
885
+
886
+ match impl_item. node {
887
+ hir:: ImplItemKind :: Const ( ref ty, _) => {
888
+ let const_def_id = ccx. tcx . map . local_def_id ( impl_item. id ) ;
889
+ generics_of_def_id ( ccx, const_def_id) ;
890
+ let ty = ccx. icx ( & impl_predicates)
891
+ . to_ty ( & ExplicitRscope , & ty) ;
892
+ tcx. item_types . borrow_mut ( ) . insert ( const_def_id, ty) ;
893
+ convert_associated_const ( ccx, ImplContainer ( impl_def_id) ,
894
+ impl_item. id , ty) ;
895
+ }
896
+
897
+ hir:: ImplItemKind :: Type ( ref ty) => {
898
+ let type_def_id = ccx. tcx . map . local_def_id ( impl_item. id ) ;
899
+ generics_of_def_id ( ccx, type_def_id) ;
900
+
901
+ if impl_trait_ref. is_none ( ) {
902
+ span_err ! ( tcx. sess, impl_item. span, E0202 ,
903
+ "associated types are not allowed in inherent impls" ) ;
904
+ }
905
+
906
+ let typ = ccx. icx ( & impl_predicates) . to_ty ( & ExplicitRscope , ty) ;
907
+
908
+ convert_associated_type ( ccx, ImplContainer ( impl_def_id) , impl_item. id , Some ( typ) ) ;
909
+ }
910
+
911
+ hir:: ImplItemKind :: Method ( ref sig, _) => {
912
+ convert_method ( ccx, ImplContainer ( impl_def_id) ,
913
+ impl_item. id , sig, impl_self_ty,
914
+ & impl_predicates) ;
915
+ }
916
+ }
917
+ }
918
+
910
919
fn convert_variant_ctor < ' a , ' tcx > ( ccx : & CrateCtxt < ' a , ' tcx > ,
911
920
ctor_id : ast:: NodeId ,
912
921
variant : ty:: VariantDef < ' tcx > ,
0 commit comments