17
17
use self :: TargetLint :: * ;
18
18
19
19
use std:: slice;
20
- use rustc_data_structures:: sync:: { ReadGuard , Lock , join} ;
20
+ use rustc_data_structures:: sync:: { ReadGuard , Lock , ParallelIterator , join, par_iter } ;
21
21
use crate :: lint:: { EarlyLintPass , LateLintPass , EarlyLintPassObject , LateLintPassObject } ;
22
22
use crate :: lint:: { LintArray , Level , Lint , LintId , LintPass , LintBuffer } ;
23
23
use crate :: lint:: builtin:: BuiltinLintDiagnostics ;
@@ -56,7 +56,7 @@ pub struct LintStore {
56
56
pre_expansion_passes : Option < Vec < EarlyLintPassObject > > ,
57
57
early_passes : Option < Vec < EarlyLintPassObject > > ,
58
58
late_passes : Lock < Option < Vec < LateLintPassObject > > > ,
59
- late_module_passes : Lock < Option < Vec < LateLintPassObject > > > ,
59
+ late_module_passes : Vec < LateLintPassObject > ,
60
60
61
61
/// Lints indexed by name.
62
62
by_name : FxHashMap < String , TargetLint > ,
@@ -144,7 +144,7 @@ impl LintStore {
144
144
pre_expansion_passes : Some ( vec ! [ ] ) ,
145
145
early_passes : Some ( vec ! [ ] ) ,
146
146
late_passes : Lock :: new ( Some ( vec ! [ ] ) ) ,
147
- late_module_passes : Lock :: new ( Some ( vec ! [ ] ) ) ,
147
+ late_module_passes : vec ! [ ] ,
148
148
by_name : Default :: default ( ) ,
149
149
future_incompatible : Default :: default ( ) ,
150
150
lint_groups : Default :: default ( ) ,
@@ -200,7 +200,7 @@ impl LintStore {
200
200
self . push_pass ( sess, from_plugin, & pass) ;
201
201
if !register_only {
202
202
if per_module {
203
- self . late_module_passes . lock ( ) . as_mut ( ) . unwrap ( ) . push ( pass) ;
203
+ self . late_module_passes . push ( pass) ;
204
204
} else {
205
205
self . late_passes . lock ( ) . as_mut ( ) . unwrap ( ) . push ( pass) ;
206
206
}
@@ -1277,14 +1277,12 @@ pub fn late_lint_mod<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(
1277
1277
1278
1278
late_lint_mod_pass ( tcx, module_def_id, builtin_lints) ;
1279
1279
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 ( ) ;
1281
1282
1282
1283
if !passes. is_empty ( ) {
1283
1284
late_lint_mod_pass ( tcx, module_def_id, LateLintPassObjects { lints : & mut passes[ ..] } ) ;
1284
1285
}
1285
-
1286
- // Put the passes back in the session.
1287
- * tcx. sess . lint_store . borrow ( ) . late_module_passes . lock ( ) = Some ( passes) ;
1288
1286
}
1289
1287
1290
1288
fn 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>>(
1342
1340
} ) ;
1343
1341
}
1344
1342
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 ( ) ;
1346
1345
1347
1346
for pass in & mut passes {
1348
1347
time ( tcx. sess , & format ! ( "running late module lint: {}" , pass. name( ) ) , || {
1349
1348
late_lint_pass_crate ( tcx, LateLintPassObjects { lints : slice:: from_mut ( pass) } ) ;
1350
1349
} ) ;
1351
1350
}
1352
-
1353
- // Put the passes back in the session.
1354
- * tcx. sess . lint_store . borrow ( ) . late_module_passes . lock ( ) = Some ( passes) ;
1355
1351
}
1356
1352
1357
1353
// Put the passes back in the session.
@@ -1371,9 +1367,9 @@ pub fn check_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(
1371
1367
} , || {
1372
1368
time ( tcx. sess , "module lints" , || {
1373
1369
// Run per-module lints
1374
- for & module in tcx. hir ( ) . krate ( ) . modules . keys ( ) {
1370
+ par_iter ( & tcx. hir ( ) . krate ( ) . modules ) . for_each ( | ( & module , _ ) | {
1375
1371
tcx. ensure ( ) . lint_mod ( tcx. hir ( ) . local_def_id ( module) ) ;
1376
- }
1372
+ } ) ;
1377
1373
} ) ;
1378
1374
} ) ;
1379
1375
}
0 commit comments