17
17
use self :: TargetLint :: * ;
18
18
19
19
use crate :: hir;
20
- use crate :: hir:: def_id:: { CrateNum , DefId , LOCAL_CRATE } ;
21
- use crate :: hir:: intravisit as hir_visit;
22
- use crate :: hir:: intravisit:: Visitor ;
20
+ use crate :: hir:: def_id:: { CrateNum , DefId } ;
23
21
use crate :: hir:: map:: { definitions:: DisambiguatedDefPathData , DefPathData } ;
24
22
use crate :: lint:: builtin:: BuiltinLintDiagnostics ;
25
23
use crate :: lint:: levels:: { LintLevelSets , LintLevelsBuilder } ;
26
- use crate :: lint:: { EarlyLintPassObject , LateLintPass , LateLintPassObject } ;
27
- use crate :: lint:: { FutureIncompatibleInfo , Level , Lint , LintBuffer , LintId , LintPass } ;
24
+ use crate :: lint:: { EarlyLintPassObject , LateLintPassObject } ;
25
+ use crate :: lint:: { FutureIncompatibleInfo , Level , Lint , LintBuffer , LintId } ;
28
26
use crate :: middle:: privacy:: AccessLevels ;
29
27
use crate :: session:: Session ;
30
28
use crate :: ty:: layout:: { LayoutError , LayoutOf , TyLayout } ;
31
29
use crate :: ty:: { self , print:: Printer , subst:: GenericArg , Ty , TyCtxt } ;
32
- use crate :: util:: common:: time;
33
30
use crate :: util:: nodemap:: FxHashMap ;
34
31
35
32
use errors:: DiagnosticBuilder ;
36
- use rustc_data_structures:: sync:: { self , join , par_iter , ParallelIterator } ;
33
+ use rustc_data_structures:: sync;
37
34
use rustc_span:: { symbol:: Symbol , MultiSpan , Span } ;
38
35
use std:: slice;
39
36
use syntax:: ast;
@@ -57,9 +54,9 @@ pub struct LintStore {
57
54
/// necessarily in a sane manner. This is safe though.)
58
55
pub pre_expansion_passes : Vec < Box < dyn Fn ( ) -> EarlyLintPassObject + sync:: Send + sync:: Sync > > ,
59
56
pub early_passes : Vec < Box < dyn Fn ( ) -> EarlyLintPassObject + sync:: Send + sync:: Sync > > ,
60
- late_passes : Vec < Box < dyn Fn ( ) -> LateLintPassObject + sync:: Send + sync:: Sync > > ,
57
+ pub late_passes : Vec < Box < dyn Fn ( ) -> LateLintPassObject + sync:: Send + sync:: Sync > > ,
61
58
/// This is unique in that we construct them per-module, so not once.
62
- late_module_passes : Vec < Box < dyn Fn ( ) -> LateLintPassObject + sync:: Send + sync:: Sync > > ,
59
+ pub late_module_passes : Vec < Box < dyn Fn ( ) -> LateLintPassObject + sync:: Send + sync:: Sync > > ,
63
60
64
61
/// Lints indexed by name.
65
62
by_name : FxHashMap < String , TargetLint > ,
@@ -446,9 +443,9 @@ pub struct LateContext<'a, 'tcx> {
446
443
pub access_levels : & ' a AccessLevels ,
447
444
448
445
/// The store of registered lints and the lint levels.
449
- lint_store : & ' tcx LintStore ,
446
+ pub lint_store : & ' tcx LintStore ,
450
447
451
- last_node_with_lint_attrs : hir:: HirId ,
448
+ pub last_node_with_lint_attrs : hir:: HirId ,
452
449
453
450
/// Generic type parameters in scope for the item we are in.
454
451
pub generics : Option < & ' tcx hir:: Generics < ' tcx > > ,
@@ -457,11 +454,6 @@ pub struct LateContext<'a, 'tcx> {
457
454
pub only_module : bool ,
458
455
}
459
456
460
- pub struct LateContextAndPass < ' a , ' tcx , T : LateLintPass < ' a , ' tcx > > {
461
- context : LateContext < ' a , ' tcx > ,
462
- pass : T ,
463
- }
464
-
465
457
/// Context for lint checking of the AST, after expansion, before lowering to
466
458
/// HIR.
467
459
pub struct EarlyContext < ' a > {
@@ -578,10 +570,6 @@ impl<'a> EarlyContext<'a> {
578
570
}
579
571
}
580
572
581
- macro_rules! lint_callback { ( $cx: expr, $f: ident, $( $args: expr) ,* ) => ( {
582
- $cx. pass. $f( & $cx. context, $( $args) ,* ) ;
583
- } ) }
584
-
585
573
impl LintContext for LateContext < ' _ , ' _ > {
586
574
type PassObject = LateLintPassObject ;
587
575
@@ -783,434 +771,3 @@ impl<'a, 'tcx> LayoutOf for LateContext<'a, 'tcx> {
783
771
self . tcx . layout_of ( self . param_env . and ( ty) )
784
772
}
785
773
}
786
-
787
- impl < ' a , ' tcx , T : LateLintPass < ' a , ' tcx > > LateContextAndPass < ' a , ' tcx , T > {
788
- /// Merge the lints specified by any lint attributes into the
789
- /// current lint context, call the provided function, then reset the
790
- /// lints in effect to their previous state.
791
- fn with_lint_attrs < F > ( & mut self , id : hir:: HirId , attrs : & ' tcx [ ast:: Attribute ] , f : F )
792
- where
793
- F : FnOnce ( & mut Self ) ,
794
- {
795
- let prev = self . context . last_node_with_lint_attrs ;
796
- self . context . last_node_with_lint_attrs = id;
797
- self . enter_attrs ( attrs) ;
798
- f ( self ) ;
799
- self . exit_attrs ( attrs) ;
800
- self . context . last_node_with_lint_attrs = prev;
801
- }
802
-
803
- fn with_param_env < F > ( & mut self , id : hir:: HirId , f : F )
804
- where
805
- F : FnOnce ( & mut Self ) ,
806
- {
807
- let old_param_env = self . context . param_env ;
808
- self . context . param_env =
809
- self . context . tcx . param_env ( self . context . tcx . hir ( ) . local_def_id ( id) ) ;
810
- f ( self ) ;
811
- self . context . param_env = old_param_env;
812
- }
813
-
814
- fn process_mod ( & mut self , m : & ' tcx hir:: Mod < ' tcx > , s : Span , n : hir:: HirId ) {
815
- lint_callback ! ( self , check_mod, m, s, n) ;
816
- hir_visit:: walk_mod ( self , m, n) ;
817
- lint_callback ! ( self , check_mod_post, m, s, n) ;
818
- }
819
-
820
- fn enter_attrs ( & mut self , attrs : & ' tcx [ ast:: Attribute ] ) {
821
- debug ! ( "late context: enter_attrs({:?})" , attrs) ;
822
- lint_callback ! ( self , enter_lint_attrs, attrs) ;
823
- }
824
-
825
- fn exit_attrs ( & mut self , attrs : & ' tcx [ ast:: Attribute ] ) {
826
- debug ! ( "late context: exit_attrs({:?})" , attrs) ;
827
- lint_callback ! ( self , exit_lint_attrs, attrs) ;
828
- }
829
- }
830
-
831
- impl < ' a , ' tcx , T : LateLintPass < ' a , ' tcx > > hir_visit:: Visitor < ' tcx >
832
- for LateContextAndPass < ' a , ' tcx , T >
833
- {
834
- /// Because lints are scoped lexically, we want to walk nested
835
- /// items in the context of the outer item, so enable
836
- /// deep-walking.
837
- fn nested_visit_map < ' this > ( & ' this mut self ) -> hir_visit:: NestedVisitorMap < ' this , ' tcx > {
838
- hir_visit:: NestedVisitorMap :: All ( & self . context . tcx . hir ( ) )
839
- }
840
-
841
- fn visit_nested_body ( & mut self , body : hir:: BodyId ) {
842
- let old_tables = self . context . tables ;
843
- self . context . tables = self . context . tcx . body_tables ( body) ;
844
- let body = self . context . tcx . hir ( ) . body ( body) ;
845
- self . visit_body ( body) ;
846
- self . context . tables = old_tables;
847
- }
848
-
849
- fn visit_param ( & mut self , param : & ' tcx hir:: Param < ' tcx > ) {
850
- self . with_lint_attrs ( param. hir_id , & param. attrs , |cx| {
851
- lint_callback ! ( cx, check_param, param) ;
852
- hir_visit:: walk_param ( cx, param) ;
853
- } ) ;
854
- }
855
-
856
- fn visit_body ( & mut self , body : & ' tcx hir:: Body < ' tcx > ) {
857
- lint_callback ! ( self , check_body, body) ;
858
- hir_visit:: walk_body ( self , body) ;
859
- lint_callback ! ( self , check_body_post, body) ;
860
- }
861
-
862
- fn visit_item ( & mut self , it : & ' tcx hir:: Item < ' tcx > ) {
863
- let generics = self . context . generics . take ( ) ;
864
- self . context . generics = it. kind . generics ( ) ;
865
- self . with_lint_attrs ( it. hir_id , & it. attrs , |cx| {
866
- cx. with_param_env ( it. hir_id , |cx| {
867
- lint_callback ! ( cx, check_item, it) ;
868
- hir_visit:: walk_item ( cx, it) ;
869
- lint_callback ! ( cx, check_item_post, it) ;
870
- } ) ;
871
- } ) ;
872
- self . context . generics = generics;
873
- }
874
-
875
- fn visit_foreign_item ( & mut self , it : & ' tcx hir:: ForeignItem < ' tcx > ) {
876
- self . with_lint_attrs ( it. hir_id , & it. attrs , |cx| {
877
- cx. with_param_env ( it. hir_id , |cx| {
878
- lint_callback ! ( cx, check_foreign_item, it) ;
879
- hir_visit:: walk_foreign_item ( cx, it) ;
880
- lint_callback ! ( cx, check_foreign_item_post, it) ;
881
- } ) ;
882
- } )
883
- }
884
-
885
- fn visit_pat ( & mut self , p : & ' tcx hir:: Pat < ' tcx > ) {
886
- lint_callback ! ( self , check_pat, p) ;
887
- hir_visit:: walk_pat ( self , p) ;
888
- }
889
-
890
- fn visit_expr ( & mut self , e : & ' tcx hir:: Expr < ' tcx > ) {
891
- self . with_lint_attrs ( e. hir_id , & e. attrs , |cx| {
892
- lint_callback ! ( cx, check_expr, e) ;
893
- hir_visit:: walk_expr ( cx, e) ;
894
- lint_callback ! ( cx, check_expr_post, e) ;
895
- } )
896
- }
897
-
898
- fn visit_stmt ( & mut self , s : & ' tcx hir:: Stmt < ' tcx > ) {
899
- // statement attributes are actually just attributes on one of
900
- // - item
901
- // - local
902
- // - expression
903
- // so we keep track of lint levels there
904
- lint_callback ! ( self , check_stmt, s) ;
905
- hir_visit:: walk_stmt ( self , s) ;
906
- }
907
-
908
- fn visit_fn (
909
- & mut self ,
910
- fk : hir_visit:: FnKind < ' tcx > ,
911
- decl : & ' tcx hir:: FnDecl < ' tcx > ,
912
- body_id : hir:: BodyId ,
913
- span : Span ,
914
- id : hir:: HirId ,
915
- ) {
916
- // Wrap in tables here, not just in visit_nested_body,
917
- // in order for `check_fn` to be able to use them.
918
- let old_tables = self . context . tables ;
919
- self . context . tables = self . context . tcx . body_tables ( body_id) ;
920
- let body = self . context . tcx . hir ( ) . body ( body_id) ;
921
- lint_callback ! ( self , check_fn, fk, decl, body, span, id) ;
922
- hir_visit:: walk_fn ( self , fk, decl, body_id, span, id) ;
923
- lint_callback ! ( self , check_fn_post, fk, decl, body, span, id) ;
924
- self . context . tables = old_tables;
925
- }
926
-
927
- fn visit_variant_data (
928
- & mut self ,
929
- s : & ' tcx hir:: VariantData < ' tcx > ,
930
- _: ast:: Name ,
931
- _: & ' tcx hir:: Generics < ' tcx > ,
932
- _: hir:: HirId ,
933
- _: Span ,
934
- ) {
935
- lint_callback ! ( self , check_struct_def, s) ;
936
- hir_visit:: walk_struct_def ( self , s) ;
937
- lint_callback ! ( self , check_struct_def_post, s) ;
938
- }
939
-
940
- fn visit_struct_field ( & mut self , s : & ' tcx hir:: StructField < ' tcx > ) {
941
- self . with_lint_attrs ( s. hir_id , & s. attrs , |cx| {
942
- lint_callback ! ( cx, check_struct_field, s) ;
943
- hir_visit:: walk_struct_field ( cx, s) ;
944
- } )
945
- }
946
-
947
- fn visit_variant (
948
- & mut self ,
949
- v : & ' tcx hir:: Variant < ' tcx > ,
950
- g : & ' tcx hir:: Generics < ' tcx > ,
951
- item_id : hir:: HirId ,
952
- ) {
953
- self . with_lint_attrs ( v. id , & v. attrs , |cx| {
954
- lint_callback ! ( cx, check_variant, v) ;
955
- hir_visit:: walk_variant ( cx, v, g, item_id) ;
956
- lint_callback ! ( cx, check_variant_post, v) ;
957
- } )
958
- }
959
-
960
- fn visit_ty ( & mut self , t : & ' tcx hir:: Ty < ' tcx > ) {
961
- lint_callback ! ( self , check_ty, t) ;
962
- hir_visit:: walk_ty ( self , t) ;
963
- }
964
-
965
- fn visit_name ( & mut self , sp : Span , name : ast:: Name ) {
966
- lint_callback ! ( self , check_name, sp, name) ;
967
- }
968
-
969
- fn visit_mod ( & mut self , m : & ' tcx hir:: Mod < ' tcx > , s : Span , n : hir:: HirId ) {
970
- if !self . context . only_module {
971
- self . process_mod ( m, s, n) ;
972
- }
973
- }
974
-
975
- fn visit_local ( & mut self , l : & ' tcx hir:: Local < ' tcx > ) {
976
- self . with_lint_attrs ( l. hir_id , & l. attrs , |cx| {
977
- lint_callback ! ( cx, check_local, l) ;
978
- hir_visit:: walk_local ( cx, l) ;
979
- } )
980
- }
981
-
982
- fn visit_block ( & mut self , b : & ' tcx hir:: Block < ' tcx > ) {
983
- lint_callback ! ( self , check_block, b) ;
984
- hir_visit:: walk_block ( self , b) ;
985
- lint_callback ! ( self , check_block_post, b) ;
986
- }
987
-
988
- fn visit_arm ( & mut self , a : & ' tcx hir:: Arm < ' tcx > ) {
989
- lint_callback ! ( self , check_arm, a) ;
990
- hir_visit:: walk_arm ( self , a) ;
991
- }
992
-
993
- fn visit_generic_param ( & mut self , p : & ' tcx hir:: GenericParam < ' tcx > ) {
994
- lint_callback ! ( self , check_generic_param, p) ;
995
- hir_visit:: walk_generic_param ( self , p) ;
996
- }
997
-
998
- fn visit_generics ( & mut self , g : & ' tcx hir:: Generics < ' tcx > ) {
999
- lint_callback ! ( self , check_generics, g) ;
1000
- hir_visit:: walk_generics ( self , g) ;
1001
- }
1002
-
1003
- fn visit_where_predicate ( & mut self , p : & ' tcx hir:: WherePredicate < ' tcx > ) {
1004
- lint_callback ! ( self , check_where_predicate, p) ;
1005
- hir_visit:: walk_where_predicate ( self , p) ;
1006
- }
1007
-
1008
- fn visit_poly_trait_ref (
1009
- & mut self ,
1010
- t : & ' tcx hir:: PolyTraitRef < ' tcx > ,
1011
- m : hir:: TraitBoundModifier ,
1012
- ) {
1013
- lint_callback ! ( self , check_poly_trait_ref, t, m) ;
1014
- hir_visit:: walk_poly_trait_ref ( self , t, m) ;
1015
- }
1016
-
1017
- fn visit_trait_item ( & mut self , trait_item : & ' tcx hir:: TraitItem < ' tcx > ) {
1018
- let generics = self . context . generics . take ( ) ;
1019
- self . context . generics = Some ( & trait_item. generics ) ;
1020
- self . with_lint_attrs ( trait_item. hir_id , & trait_item. attrs , |cx| {
1021
- cx. with_param_env ( trait_item. hir_id , |cx| {
1022
- lint_callback ! ( cx, check_trait_item, trait_item) ;
1023
- hir_visit:: walk_trait_item ( cx, trait_item) ;
1024
- lint_callback ! ( cx, check_trait_item_post, trait_item) ;
1025
- } ) ;
1026
- } ) ;
1027
- self . context . generics = generics;
1028
- }
1029
-
1030
- fn visit_impl_item ( & mut self , impl_item : & ' tcx hir:: ImplItem < ' tcx > ) {
1031
- let generics = self . context . generics . take ( ) ;
1032
- self . context . generics = Some ( & impl_item. generics ) ;
1033
- self . with_lint_attrs ( impl_item. hir_id , & impl_item. attrs , |cx| {
1034
- cx. with_param_env ( impl_item. hir_id , |cx| {
1035
- lint_callback ! ( cx, check_impl_item, impl_item) ;
1036
- hir_visit:: walk_impl_item ( cx, impl_item) ;
1037
- lint_callback ! ( cx, check_impl_item_post, impl_item) ;
1038
- } ) ;
1039
- } ) ;
1040
- self . context . generics = generics;
1041
- }
1042
-
1043
- fn visit_lifetime ( & mut self , lt : & ' tcx hir:: Lifetime ) {
1044
- lint_callback ! ( self , check_lifetime, lt) ;
1045
- hir_visit:: walk_lifetime ( self , lt) ;
1046
- }
1047
-
1048
- fn visit_path ( & mut self , p : & ' tcx hir:: Path < ' tcx > , id : hir:: HirId ) {
1049
- lint_callback ! ( self , check_path, p, id) ;
1050
- hir_visit:: walk_path ( self , p) ;
1051
- }
1052
-
1053
- fn visit_attribute ( & mut self , attr : & ' tcx ast:: Attribute ) {
1054
- lint_callback ! ( self , check_attribute, attr) ;
1055
- }
1056
- }
1057
-
1058
- struct LateLintPassObjects < ' a > {
1059
- lints : & ' a mut [ LateLintPassObject ] ,
1060
- }
1061
-
1062
- #[ allow( rustc:: lint_pass_impl_without_macro) ]
1063
- impl LintPass for LateLintPassObjects < ' _ > {
1064
- fn name ( & self ) -> & ' static str {
1065
- panic ! ( )
1066
- }
1067
- }
1068
-
1069
- macro_rules! expand_late_lint_pass_impl_methods {
1070
- ( [ $a: tt, $hir: tt] , [ $( $( #[ $attr: meta] ) * fn $name: ident( $( $param: ident: $arg: ty) ,* ) ; ) * ] ) => (
1071
- $( fn $name( & mut self , context: & LateContext <$a, $hir>, $( $param: $arg) ,* ) {
1072
- for obj in self . lints. iter_mut( ) {
1073
- obj. $name( context, $( $param) ,* ) ;
1074
- }
1075
- } ) *
1076
- )
1077
- }
1078
-
1079
- macro_rules! late_lint_pass_impl {
1080
- ( [ ] , [ $hir: tt] , $methods: tt) => (
1081
- impl LateLintPass <' a, $hir> for LateLintPassObjects <' _> {
1082
- expand_late_lint_pass_impl_methods!( [ ' a, $hir] , $methods) ;
1083
- }
1084
- )
1085
- }
1086
-
1087
- late_lint_methods ! ( late_lint_pass_impl, [ ] , [ ' tcx] ) ;
1088
-
1089
- fn late_lint_mod_pass < ' tcx , T : for < ' a > LateLintPass < ' a , ' tcx > > (
1090
- tcx : TyCtxt < ' tcx > ,
1091
- module_def_id : DefId ,
1092
- pass : T ,
1093
- ) {
1094
- let access_levels = & tcx. privacy_access_levels ( LOCAL_CRATE ) ;
1095
-
1096
- let context = LateContext {
1097
- tcx,
1098
- tables : & ty:: TypeckTables :: empty ( None ) ,
1099
- param_env : ty:: ParamEnv :: empty ( ) ,
1100
- access_levels,
1101
- lint_store : & tcx. lint_store ,
1102
- last_node_with_lint_attrs : tcx. hir ( ) . as_local_hir_id ( module_def_id) . unwrap ( ) ,
1103
- generics : None ,
1104
- only_module : true ,
1105
- } ;
1106
-
1107
- let mut cx = LateContextAndPass { context, pass } ;
1108
-
1109
- let ( module, span, hir_id) = tcx. hir ( ) . get_module ( module_def_id) ;
1110
- cx. process_mod ( module, span, hir_id) ;
1111
-
1112
- // Visit the crate attributes
1113
- if hir_id == hir:: CRATE_HIR_ID {
1114
- walk_list ! ( cx, visit_attribute, tcx. hir( ) . attrs( hir:: CRATE_HIR_ID ) ) ;
1115
- }
1116
- }
1117
-
1118
- pub fn late_lint_mod < ' tcx , T : for < ' a > LateLintPass < ' a , ' tcx > > (
1119
- tcx : TyCtxt < ' tcx > ,
1120
- module_def_id : DefId ,
1121
- builtin_lints : T ,
1122
- ) {
1123
- if tcx. sess . opts . debugging_opts . no_interleave_lints {
1124
- // These passes runs in late_lint_crate with -Z no_interleave_lints
1125
- return ;
1126
- }
1127
-
1128
- late_lint_mod_pass ( tcx, module_def_id, builtin_lints) ;
1129
-
1130
- let mut passes: Vec < _ > =
1131
- tcx. lint_store . late_module_passes . iter ( ) . map ( |pass| ( pass) ( ) ) . collect ( ) ;
1132
-
1133
- if !passes. is_empty ( ) {
1134
- late_lint_mod_pass ( tcx, module_def_id, LateLintPassObjects { lints : & mut passes[ ..] } ) ;
1135
- }
1136
- }
1137
-
1138
- fn late_lint_pass_crate < ' tcx , T : for < ' a > LateLintPass < ' a , ' tcx > > ( tcx : TyCtxt < ' tcx > , pass : T ) {
1139
- let access_levels = & tcx. privacy_access_levels ( LOCAL_CRATE ) ;
1140
-
1141
- let krate = tcx. hir ( ) . krate ( ) ;
1142
-
1143
- let context = LateContext {
1144
- tcx,
1145
- tables : & ty:: TypeckTables :: empty ( None ) ,
1146
- param_env : ty:: ParamEnv :: empty ( ) ,
1147
- access_levels,
1148
- lint_store : & tcx. lint_store ,
1149
- last_node_with_lint_attrs : hir:: CRATE_HIR_ID ,
1150
- generics : None ,
1151
- only_module : false ,
1152
- } ;
1153
-
1154
- let mut cx = LateContextAndPass { context, pass } ;
1155
-
1156
- // Visit the whole crate.
1157
- cx. with_lint_attrs ( hir:: CRATE_HIR_ID , & krate. attrs , |cx| {
1158
- // since the root module isn't visited as an item (because it isn't an
1159
- // item), warn for it here.
1160
- lint_callback ! ( cx, check_crate, krate) ;
1161
-
1162
- hir_visit:: walk_crate ( cx, krate) ;
1163
-
1164
- lint_callback ! ( cx, check_crate_post, krate) ;
1165
- } )
1166
- }
1167
-
1168
- fn late_lint_crate < ' tcx , T : for < ' a > LateLintPass < ' a , ' tcx > > ( tcx : TyCtxt < ' tcx > , builtin_lints : T ) {
1169
- let mut passes = tcx. lint_store . late_passes . iter ( ) . map ( |p| ( p) ( ) ) . collect :: < Vec < _ > > ( ) ;
1170
-
1171
- if !tcx. sess . opts . debugging_opts . no_interleave_lints {
1172
- if !passes. is_empty ( ) {
1173
- late_lint_pass_crate ( tcx, LateLintPassObjects { lints : & mut passes[ ..] } ) ;
1174
- }
1175
-
1176
- late_lint_pass_crate ( tcx, builtin_lints) ;
1177
- } else {
1178
- for pass in & mut passes {
1179
- time ( tcx. sess , & format ! ( "running late lint: {}" , pass. name( ) ) , || {
1180
- late_lint_pass_crate ( tcx, LateLintPassObjects { lints : slice:: from_mut ( pass) } ) ;
1181
- } ) ;
1182
- }
1183
-
1184
- let mut passes: Vec < _ > =
1185
- tcx. lint_store . late_module_passes . iter ( ) . map ( |pass| ( pass) ( ) ) . collect ( ) ;
1186
-
1187
- for pass in & mut passes {
1188
- time ( tcx. sess , & format ! ( "running late module lint: {}" , pass. name( ) ) , || {
1189
- late_lint_pass_crate ( tcx, LateLintPassObjects { lints : slice:: from_mut ( pass) } ) ;
1190
- } ) ;
1191
- }
1192
- }
1193
- }
1194
-
1195
- /// Performs lint checking on a crate.
1196
- pub fn check_crate < ' tcx , T : for < ' a > LateLintPass < ' a , ' tcx > > (
1197
- tcx : TyCtxt < ' tcx > ,
1198
- builtin_lints : impl FnOnce ( ) -> T + Send ,
1199
- ) {
1200
- join (
1201
- || {
1202
- time ( tcx. sess , "crate lints" , || {
1203
- // Run whole crate non-incremental lints
1204
- late_lint_crate ( tcx, builtin_lints ( ) ) ;
1205
- } ) ;
1206
- } ,
1207
- || {
1208
- time ( tcx. sess , "module lints" , || {
1209
- // Run per-module lints
1210
- par_iter ( & tcx. hir ( ) . krate ( ) . modules ) . for_each ( |( & module, _) | {
1211
- tcx. ensure ( ) . lint_mod ( tcx. hir ( ) . local_def_id ( module) ) ;
1212
- } ) ;
1213
- } ) ;
1214
- } ,
1215
- ) ;
1216
- }
0 commit comments