@@ -5,6 +5,7 @@ use rustc_data_structures::fx::FxHashMap;
5
5
use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
6
6
use rustc_errors:: { DiagnosticBuilder , DiagnosticId } ;
7
7
use rustc_hir:: HirId ;
8
+ use rustc_index:: vec:: IndexVec ;
8
9
use rustc_session:: lint:: {
9
10
builtin:: { self , FORBIDDEN_LINT_GROUPS } ,
10
11
FutureIncompatibilityReason , Level , Lint , LintId ,
@@ -51,35 +52,37 @@ impl LintLevelSource {
51
52
/// A tuple of a lint level and its source.
52
53
pub type LevelAndSource = ( Level , LintLevelSource ) ;
53
54
54
- #[ derive( Debug ) ]
55
+ #[ derive( Debug , HashStable ) ]
55
56
pub struct LintLevelSets {
56
- pub list : Vec < LintSet > ,
57
+ pub list : IndexVec < LintStackIndex , LintSet > ,
57
58
pub lint_cap : Level ,
58
59
}
59
60
60
- #[ derive( Debug ) ]
61
- pub enum LintSet {
62
- CommandLine {
63
- // -A,-W,-D flags, a `Symbol` for the flag itself and `Level` for which
64
- // flag.
65
- specs : FxHashMap < LintId , LevelAndSource > ,
66
- } ,
67
-
68
- Node {
69
- specs : FxHashMap < LintId , LevelAndSource > ,
70
- parent : u32 ,
71
- } ,
61
+ rustc_index:: newtype_index! {
62
+ #[ derive( HashStable ) ]
63
+ pub struct LintStackIndex {
64
+ const COMMAND_LINE = 0 ,
65
+ }
66
+ }
67
+
68
+ #[ derive( Debug , HashStable ) ]
69
+ pub struct LintSet {
70
+ // -A,-W,-D flags, a `Symbol` for the flag itself and `Level` for which
71
+ // flag.
72
+ pub specs : FxHashMap < LintId , LevelAndSource > ,
73
+
74
+ pub parent : LintStackIndex ,
72
75
}
73
76
74
77
impl LintLevelSets {
75
78
pub fn new ( ) -> Self {
76
- LintLevelSets { list : Vec :: new ( ) , lint_cap : Level :: Forbid }
79
+ LintLevelSets { list : IndexVec :: new ( ) , lint_cap : Level :: Forbid }
77
80
}
78
81
79
82
pub fn get_lint_level (
80
83
& self ,
81
84
lint : & ' static Lint ,
82
- idx : u32 ,
85
+ idx : LintStackIndex ,
83
86
aux : Option < & FxHashMap < LintId , LevelAndSource > > ,
84
87
sess : & Session ,
85
88
) -> LevelAndSource {
@@ -122,7 +125,7 @@ impl LintLevelSets {
122
125
pub fn get_lint_id_level (
123
126
& self ,
124
127
id : LintId ,
125
- mut idx : u32 ,
128
+ mut idx : LintStackIndex ,
126
129
aux : Option < & FxHashMap < LintId , LevelAndSource > > ,
127
130
) -> ( Option < Level > , LintLevelSource ) {
128
131
if let Some ( specs) = aux {
@@ -131,28 +134,22 @@ impl LintLevelSets {
131
134
}
132
135
}
133
136
loop {
134
- match self . list [ idx as usize ] {
135
- LintSet :: CommandLine { ref specs } => {
136
- if let Some ( & ( level, src) ) = specs. get ( & id) {
137
- return ( Some ( level) , src) ;
138
- }
139
- return ( None , LintLevelSource :: Default ) ;
140
- }
141
- LintSet :: Node { ref specs, parent } => {
142
- if let Some ( & ( level, src) ) = specs. get ( & id) {
143
- return ( Some ( level) , src) ;
144
- }
145
- idx = parent;
146
- }
137
+ let LintSet { ref specs, parent } = self . list [ idx] ;
138
+ if let Some ( & ( level, src) ) = specs. get ( & id) {
139
+ return ( Some ( level) , src) ;
140
+ }
141
+ if idx == COMMAND_LINE {
142
+ return ( None , LintLevelSource :: Default ) ;
147
143
}
144
+ idx = parent;
148
145
}
149
146
}
150
147
}
151
148
152
149
#[ derive( Debug ) ]
153
150
pub struct LintLevelMap {
154
151
pub sets : LintLevelSets ,
155
- pub id_to_set : FxHashMap < HirId , u32 > ,
152
+ pub id_to_set : FxHashMap < HirId , LintStackIndex > ,
156
153
}
157
154
158
155
impl LintLevelMap {
@@ -180,29 +177,7 @@ impl<'a> HashStable<StableHashingContext<'a>> for LintLevelMap {
180
177
181
178
id_to_set. hash_stable ( hcx, hasher) ;
182
179
183
- let LintLevelSets { ref list, lint_cap } = * sets;
184
-
185
- lint_cap. hash_stable ( hcx, hasher) ;
186
-
187
- hcx. while_hashing_spans ( true , |hcx| {
188
- list. len ( ) . hash_stable ( hcx, hasher) ;
189
-
190
- // We are working under the assumption here that the list of
191
- // lint-sets is built in a deterministic order.
192
- for lint_set in list {
193
- :: std:: mem:: discriminant ( lint_set) . hash_stable ( hcx, hasher) ;
194
-
195
- match * lint_set {
196
- LintSet :: CommandLine { ref specs } => {
197
- specs. hash_stable ( hcx, hasher) ;
198
- }
199
- LintSet :: Node { ref specs, parent } => {
200
- specs. hash_stable ( hcx, hasher) ;
201
- parent. hash_stable ( hcx, hasher) ;
202
- }
203
- }
204
- }
205
- } )
180
+ hcx. while_hashing_spans ( true , |hcx| sets. hash_stable ( hcx, hasher) )
206
181
}
207
182
}
208
183
0 commit comments