1717use self :: TargetLint :: * ;
1818
1919use std:: slice;
20- use rustc_data_structures:: sync:: { ReadGuard , Lock , join} ;
20+ use rustc_data_structures:: sync:: { ReadGuard , Lock , ParallelIterator , join, par_iter } ;
2121use crate :: lint:: { EarlyLintPass , LateLintPass , EarlyLintPassObject , LateLintPassObject } ;
2222use crate :: lint:: { LintArray , Level , Lint , LintId , LintPass , LintBuffer } ;
2323use crate :: lint:: builtin:: BuiltinLintDiagnostics ;
@@ -56,7 +56,7 @@ pub struct LintStore {
5656 pre_expansion_passes : Option < Vec < EarlyLintPassObject > > ,
5757 early_passes : Option < Vec < EarlyLintPassObject > > ,
5858 late_passes : Lock < Option < Vec < LateLintPassObject > > > ,
59- late_module_passes : Lock < Option < Vec < LateLintPassObject > > > ,
59+ late_module_passes : Vec < LateLintPassObject > ,
6060
6161 /// Lints indexed by name.
6262 by_name : FxHashMap < String , TargetLint > ,
@@ -144,7 +144,7 @@ impl LintStore {
144144 pre_expansion_passes : Some ( vec ! [ ] ) ,
145145 early_passes : Some ( vec ! [ ] ) ,
146146 late_passes : Lock :: new ( Some ( vec ! [ ] ) ) ,
147- late_module_passes : Lock :: new ( Some ( vec ! [ ] ) ) ,
147+ late_module_passes : vec ! [ ] ,
148148 by_name : Default :: default ( ) ,
149149 future_incompatible : Default :: default ( ) ,
150150 lint_groups : Default :: default ( ) ,
@@ -200,7 +200,7 @@ impl LintStore {
200200 self . push_pass ( sess, from_plugin, & pass) ;
201201 if !register_only {
202202 if per_module {
203- self . late_module_passes . lock ( ) . as_mut ( ) . unwrap ( ) . push ( pass) ;
203+ self . late_module_passes . push ( pass) ;
204204 } else {
205205 self . late_passes . lock ( ) . as_mut ( ) . unwrap ( ) . push ( pass) ;
206206 }
@@ -1277,14 +1277,12 @@ pub fn late_lint_mod<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(
12771277
12781278 late_lint_mod_pass ( tcx, module_def_id, builtin_lints) ;
12791279
1280- let mut passes = tcx. sess . lint_store . borrow ( ) . late_module_passes . lock ( ) . take ( ) . unwrap ( ) ;
1280+ let mut passes: Vec < _ > = tcx. sess . lint_store . borrow ( ) . late_module_passes
1281+ . iter ( ) . map ( |pass| pass. fresh_late_pass ( ) ) . collect ( ) ;
12811282
12821283 if !passes. is_empty ( ) {
12831284 late_lint_mod_pass ( tcx, module_def_id, LateLintPassObjects { lints : & mut passes[ ..] } ) ;
12841285 }
1285-
1286- // Put the passes back in the session.
1287- * tcx. sess . lint_store . borrow ( ) . late_module_passes . lock ( ) = Some ( passes) ;
12881286}
12891287
12901288fn late_lint_pass_crate < ' tcx , T : for < ' a > LateLintPass < ' a , ' tcx > > (
@@ -1342,16 +1340,14 @@ fn late_lint_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(
13421340 } ) ;
13431341 }
13441342
1345- let mut passes = tcx. sess . lint_store . borrow ( ) . late_module_passes . lock ( ) . take ( ) . unwrap ( ) ;
1343+ let mut passes: Vec < _ > = tcx. sess . lint_store . borrow ( ) . late_module_passes
1344+ . iter ( ) . map ( |pass| pass. fresh_late_pass ( ) ) . collect ( ) ;
13461345
13471346 for pass in & mut passes {
13481347 time ( tcx. sess , & format ! ( "running late module lint: {}" , pass. name( ) ) , || {
13491348 late_lint_pass_crate ( tcx, LateLintPassObjects { lints : slice:: from_mut ( pass) } ) ;
13501349 } ) ;
13511350 }
1352-
1353- // Put the passes back in the session.
1354- * tcx. sess . lint_store . borrow ( ) . late_module_passes . lock ( ) = Some ( passes) ;
13551351 }
13561352
13571353 // Put the passes back in the session.
@@ -1371,9 +1367,9 @@ pub fn check_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(
13711367 } , || {
13721368 time ( tcx. sess , "module lints" , || {
13731369 // Run per-module lints
1374- for & module in tcx. hir ( ) . krate ( ) . modules . keys ( ) {
1370+ par_iter ( & tcx. hir ( ) . krate ( ) . modules ) . for_each ( | ( & module , _ ) | {
13751371 tcx. ensure ( ) . lint_mod ( tcx. hir ( ) . local_def_id ( module) ) ;
1376- }
1372+ } ) ;
13771373 } ) ;
13781374 } ) ;
13791375}
0 commit comments