@@ -727,6 +727,19 @@ impl<'a> AstValidator<'a> {
727
727
)
728
728
}
729
729
}
730
+
731
+ // Used within `visit_item` for item kinds where we don't call `visit::walk_item`.
732
+ fn visit_attrs_vis ( & mut self , attrs : & ' a AttrVec , vis : & ' a Visibility ) {
733
+ walk_list ! ( self , visit_attribute, attrs) ;
734
+ self . visit_vis ( vis) ;
735
+ }
736
+
737
+ // Used within `visit_item` for item kinds where we don't call `visit::walk_item`.
738
+ fn visit_attrs_vis_ident ( & mut self , attrs : & ' a AttrVec , vis : & ' a Visibility , ident : & ' a Ident ) {
739
+ walk_list ! ( self , visit_attribute, attrs) ;
740
+ self . visit_vis ( vis) ;
741
+ self . visit_ident ( ident) ;
742
+ }
730
743
}
731
744
732
745
/// Checks that generic parameters are in the correct order,
@@ -834,6 +847,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
834
847
self_ty,
835
848
items,
836
849
} ) => {
850
+ self . visit_attrs_vis ( & item. attrs , & item. vis ) ;
837
851
self . with_in_trait_impl ( Some ( ( * constness, * polarity, t) ) , |this| {
838
852
this. visibility_not_permitted (
839
853
& item. vis ,
@@ -853,7 +867,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
853
867
} ) ;
854
868
}
855
869
856
- this. visit_vis ( & item. vis ) ;
857
870
let disallowed = matches ! ( constness, Const :: No )
858
871
. then ( || TildeConstReason :: TraitImpl { span : item. span } ) ;
859
872
this. with_tilde_const ( disallowed, |this| this. visit_generics ( generics) ) ;
@@ -862,7 +875,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
862
875
863
876
walk_list ! ( this, visit_assoc_item, items, AssocCtxt :: Impl { of_trait: true } ) ;
864
877
} ) ;
865
- walk_list ! ( self , visit_attribute, & item. attrs) ;
866
878
}
867
879
ItemKind :: Impl ( box Impl {
868
880
safety,
@@ -882,6 +894,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
882
894
only_trait,
883
895
} ;
884
896
897
+ self . visit_attrs_vis ( & item. attrs , & item. vis ) ;
885
898
self . with_in_trait_impl ( None , |this| {
886
899
this. visibility_not_permitted (
887
900
& item. vis ,
@@ -905,15 +918,13 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
905
918
this. dcx ( ) . emit_err ( error ( span, "`const`" , true ) ) ;
906
919
}
907
920
908
- this. visit_vis ( & item. vis ) ;
909
921
this. with_tilde_const (
910
922
Some ( TildeConstReason :: Impl { span : item. span } ) ,
911
923
|this| this. visit_generics ( generics) ,
912
924
) ;
913
925
this. visit_ty ( self_ty) ;
914
926
walk_list ! ( this, visit_assoc_item, items, AssocCtxt :: Impl { of_trait: false } ) ;
915
927
} ) ;
916
- walk_list ! ( self , visit_attribute, & item. attrs) ;
917
928
}
918
929
ItemKind :: Fn (
919
930
func @ box Fn {
@@ -926,6 +937,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
926
937
define_opaque : _,
927
938
} ,
928
939
) => {
940
+ self . visit_attrs_vis_ident ( & item. attrs , & item. vis , ident) ;
929
941
self . check_defaultness ( item. span , * defaultness) ;
930
942
931
943
let is_intrinsic =
@@ -953,11 +965,8 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
953
965
} ) ;
954
966
}
955
967
956
- self . visit_vis ( & item. vis ) ;
957
- self . visit_ident ( ident) ;
958
968
let kind = FnKind :: Fn ( FnCtxt :: Free , & item. vis , & * func) ;
959
969
self . visit_fn ( kind, item. span , item. id ) ;
960
- walk_list ! ( self , visit_attribute, & item. attrs) ;
961
970
}
962
971
ItemKind :: ForeignMod ( ForeignMod { extern_span, abi, safety, .. } ) => {
963
972
self . with_in_extern_mod ( * safety, |this| {
@@ -1005,6 +1014,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1005
1014
visit:: walk_item ( self , item)
1006
1015
}
1007
1016
ItemKind :: Trait ( box Trait { is_auto, generics, ident, bounds, items, .. } ) => {
1017
+ self . visit_attrs_vis_ident ( & item. attrs , & item. vis , ident) ;
1008
1018
let is_const_trait =
1009
1019
attr:: find_by_name ( & item. attrs , sym:: const_trait) . map ( |attr| attr. span ) ;
1010
1020
self . with_in_trait ( item. span , is_const_trait, |this| {
@@ -1018,8 +1028,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1018
1028
1019
1029
// Equivalent of `visit::walk_item` for `ItemKind::Trait` that inserts a bound
1020
1030
// context for the supertraits.
1021
- this. visit_vis ( & item. vis ) ;
1022
- this. visit_ident ( ident) ;
1023
1031
let disallowed = is_const_trait
1024
1032
. is_none ( )
1025
1033
. then ( || TildeConstReason :: Trait { span : item. span } ) ;
@@ -1029,7 +1037,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1029
1037
} ) ;
1030
1038
walk_list ! ( this, visit_assoc_item, items, AssocCtxt :: Trait ) ;
1031
1039
} ) ;
1032
- walk_list ! ( self , visit_attribute, & item. attrs) ;
1033
1040
}
1034
1041
ItemKind :: Mod ( safety, ident, mod_kind) => {
1035
1042
if let & Safety :: Unsafe ( span) = safety {
@@ -1045,12 +1052,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1045
1052
}
1046
1053
ItemKind :: Struct ( ident, vdata, generics) => match vdata {
1047
1054
VariantData :: Struct { fields, .. } => {
1048
- self . visit_vis ( & item. vis ) ;
1049
- self . visit_ident ( ident) ;
1055
+ self . visit_attrs_vis_ident ( & item. attrs , & item. vis , ident) ;
1050
1056
self . visit_generics ( generics) ;
1051
1057
// Permit `Anon{Struct,Union}` as field type.
1052
1058
walk_list ! ( self , visit_struct_field_def, fields) ;
1053
- walk_list ! ( self , visit_attribute, & item. attrs) ;
1054
1059
}
1055
1060
_ => visit:: walk_item ( self , item) ,
1056
1061
} ,
@@ -1060,12 +1065,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1060
1065
}
1061
1066
match vdata {
1062
1067
VariantData :: Struct { fields, .. } => {
1063
- self . visit_vis ( & item. vis ) ;
1064
- self . visit_ident ( ident) ;
1068
+ self . visit_attrs_vis_ident ( & item. attrs , & item. vis , ident) ;
1065
1069
self . visit_generics ( generics) ;
1066
1070
// Permit `Anon{Struct,Union}` as field type.
1067
1071
walk_list ! ( self , visit_struct_field_def, fields) ;
1068
- walk_list ! ( self , visit_attribute, & item. attrs) ;
1069
1072
}
1070
1073
_ => visit:: walk_item ( self , item) ,
1071
1074
}
@@ -1484,10 +1487,8 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1484
1487
|| ctxt == AssocCtxt :: Trait
1485
1488
|| matches ! ( func. sig. header. constness, Const :: Yes ( _) ) =>
1486
1489
{
1487
- self . visit_vis ( & item. vis ) ;
1488
- self . visit_ident ( & func. ident ) ;
1490
+ self . visit_attrs_vis_ident ( & item. attrs , & item. vis , & func. ident ) ;
1489
1491
let kind = FnKind :: Fn ( FnCtxt :: Assoc ( ctxt) , & item. vis , & * func) ;
1490
- walk_list ! ( self , visit_attribute, & item. attrs) ;
1491
1492
self . visit_fn ( kind, item. span , item. id ) ;
1492
1493
}
1493
1494
AssocItemKind :: Type ( _) => {
0 commit comments