@@ -35,7 +35,7 @@ use crate::util::common::time;
35
35
use errors:: DiagnosticBuilder ;
36
36
use std:: slice;
37
37
use std:: default:: Default as StdDefault ;
38
- use rustc_data_structures:: sync:: { ReadGuard , Lock , ParallelIterator , join, par_iter} ;
38
+ use rustc_data_structures:: sync:: { ReadGuard , ParallelIterator , join, par_iter} ;
39
39
use rustc_serialize:: { Decoder , Decodable , Encoder , Encodable } ;
40
40
use syntax:: ast;
41
41
use syntax:: edition;
@@ -52,12 +52,17 @@ pub struct LintStore {
52
52
/// added by a plugin.
53
53
lints : Vec < & ' static Lint > ,
54
54
55
- /// Trait objects for each lint pass.
56
- /// This is only `None` while performing a lint pass.
57
- pre_expansion_passes : Option < Vec < EarlyLintPassObject > > ,
58
- early_passes : Option < Vec < EarlyLintPassObject > > ,
59
- late_passes : Lock < Option < Vec < LateLintPassObject > > > ,
60
- late_module_passes : Vec < LateLintPassObject > ,
55
+ /// Constructor functions for each variety of lint pass.
56
+ ///
57
+ /// These should only be called once, but since we want to avoid locks or
58
+ /// interior mutability, we don't enforce this (and lints should, in theory,
59
+ /// be compatible with being constructed more than once, though not
60
+ /// necessarily in a sane manner. This is safe though.)
61
+ pre_expansion_passes : Vec < fn ( ) -> EarlyLintPassObject > ,
62
+ early_passes : Vec < fn ( ) -> EarlyLintPassObject > ,
63
+ late_passes : Vec < fn ( ) -> LateLintPassObject > ,
64
+ /// This is unique in that we construct them per-module, so not once.
65
+ late_module_passes : Vec < fn ( ) -> LateLintPassObject > ,
61
66
62
67
/// Lints indexed by name.
63
68
by_name : FxHashMap < String , TargetLint > ,
@@ -142,9 +147,9 @@ impl LintStore {
142
147
pub fn new ( ) -> LintStore {
143
148
LintStore {
144
149
lints : vec ! [ ] ,
145
- pre_expansion_passes : Some ( vec ! [ ] ) ,
146
- early_passes : Some ( vec ! [ ] ) ,
147
- late_passes : Lock :: new ( Some ( vec ! [ ] ) ) ,
150
+ pre_expansion_passes : vec ! [ ] ,
151
+ early_passes : vec ! [ ] ,
152
+ late_passes : vec ! [ ] ,
148
153
late_module_passes : vec ! [ ] ,
149
154
by_name : Default :: default ( ) ,
150
155
future_incompatible : Default :: default ( ) ,
@@ -169,19 +174,19 @@ impl LintStore {
169
174
}
170
175
171
176
pub fn register_early_pass ( & mut self , pass : fn ( ) -> EarlyLintPassObject ) {
172
- self . early_passes . as_mut ( ) . unwrap ( ) . push ( ( pass) ( ) ) ;
177
+ self . early_passes . push ( pass) ;
173
178
}
174
179
175
180
pub fn register_pre_expansion_pass ( & mut self , pass : fn ( ) -> EarlyLintPassObject ) {
176
- self . pre_expansion_passes . as_mut ( ) . unwrap ( ) . push ( ( pass) ( ) ) ;
181
+ self . pre_expansion_passes . push ( pass) ;
177
182
}
178
183
179
184
pub fn register_late_pass ( & mut self , pass : fn ( ) -> LateLintPassObject ) {
180
- self . late_passes . lock ( ) . as_mut ( ) . unwrap ( ) . push ( ( pass) ( ) ) ;
185
+ self . late_passes . push ( pass) ;
181
186
}
182
187
183
188
pub fn register_late_mod_pass ( & mut self , pass : fn ( ) -> LateLintPassObject ) {
184
- self . late_module_passes . push ( ( pass) ( ) ) ;
189
+ self . late_module_passes . push ( pass) ;
185
190
}
186
191
187
192
// Helper method for register_early/late_pass
@@ -1374,7 +1379,7 @@ pub fn late_lint_mod<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(
1374
1379
late_lint_mod_pass ( tcx, module_def_id, builtin_lints) ;
1375
1380
1376
1381
let mut passes: Vec < _ > = tcx. sess . lint_store . borrow ( ) . late_module_passes
1377
- . iter ( ) . map ( |pass| pass. fresh_late_pass ( ) ) . collect ( ) ;
1382
+ . iter ( ) . map ( |pass| ( pass) ( ) ) . collect ( ) ;
1378
1383
1379
1384
if !passes. is_empty ( ) {
1380
1385
late_lint_mod_pass ( tcx, module_def_id, LateLintPassObjects { lints : & mut passes[ ..] } ) ;
@@ -1415,7 +1420,8 @@ fn late_lint_pass_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(tcx: TyCtxt<'tc
1415
1420
}
1416
1421
1417
1422
fn late_lint_crate < ' tcx , T : for < ' a > LateLintPass < ' a , ' tcx > > ( tcx : TyCtxt < ' tcx > , builtin_lints : T ) {
1418
- let mut passes = tcx. sess . lint_store . borrow ( ) . late_passes . lock ( ) . take ( ) . unwrap ( ) ;
1423
+ let mut passes = tcx. sess . lint_store . borrow ( )
1424
+ . late_passes . iter ( ) . map ( |p| ( p) ( ) ) . collect :: < Vec < _ > > ( ) ;
1419
1425
1420
1426
if !tcx. sess . opts . debugging_opts . no_interleave_lints {
1421
1427
if !passes. is_empty ( ) {
@@ -1431,17 +1437,14 @@ fn late_lint_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(tcx: TyCtxt<'tcx>, b
1431
1437
}
1432
1438
1433
1439
let mut passes: Vec < _ > = tcx. sess . lint_store . borrow ( ) . late_module_passes
1434
- . iter ( ) . map ( |pass| pass. fresh_late_pass ( ) ) . collect ( ) ;
1440
+ . iter ( ) . map ( |pass| ( pass) ( ) ) . collect ( ) ;
1435
1441
1436
1442
for pass in & mut passes {
1437
1443
time ( tcx. sess , & format ! ( "running late module lint: {}" , pass. name( ) ) , || {
1438
1444
late_lint_pass_crate ( tcx, LateLintPassObjects { lints : slice:: from_mut ( pass) } ) ;
1439
1445
} ) ;
1440
1446
}
1441
1447
}
1442
-
1443
- // Put the passes back in the session.
1444
- * tcx. sess . lint_store . borrow ( ) . late_passes . lock ( ) = Some ( passes) ;
1445
1448
}
1446
1449
1447
1450
/// Performs lint checking on a crate.
@@ -1525,14 +1528,14 @@ pub fn check_ast_crate<T: EarlyLintPass>(
1525
1528
pre_expansion : bool ,
1526
1529
builtin_lints : T ,
1527
1530
) {
1528
- let ( mut passes, mut buffered) = if pre_expansion {
1531
+ let ( mut passes, mut buffered) : ( Vec < _ > , _ ) = if pre_expansion {
1529
1532
(
1530
- sess. lint_store . borrow_mut ( ) . pre_expansion_passes . take ( ) . unwrap ( ) ,
1533
+ sess. lint_store . borrow ( ) . pre_expansion_passes . iter ( ) . map ( |p| ( p ) ( ) ) . collect ( ) ,
1531
1534
LintBuffer :: default ( ) ,
1532
1535
)
1533
1536
} else {
1534
1537
(
1535
- sess. lint_store . borrow_mut ( ) . early_passes . take ( ) . unwrap ( ) ,
1538
+ sess. lint_store . borrow ( ) . early_passes . iter ( ) . map ( |p| ( p ) ( ) ) . collect ( ) ,
1536
1539
sess. buffered_lints . borrow_mut ( ) . take ( ) . unwrap ( ) ,
1537
1540
)
1538
1541
} ;
@@ -1561,13 +1564,6 @@ pub fn check_ast_crate<T: EarlyLintPass>(
1561
1564
}
1562
1565
}
1563
1566
1564
- // Put the lint store levels and passes back in the session.
1565
- if pre_expansion {
1566
- sess. lint_store . borrow_mut ( ) . pre_expansion_passes = Some ( passes) ;
1567
- } else {
1568
- sess. lint_store . borrow_mut ( ) . early_passes = Some ( passes) ;
1569
- }
1570
-
1571
1567
// All of the buffered lints should have been emitted at this point.
1572
1568
// If not, that means that we somehow buffered a lint for a node id
1573
1569
// that was not lint-checked (perhaps it doesn't exist?). This is a bug.
0 commit comments