@@ -63,7 +63,7 @@ pub struct LintStore {
63
63
passes : Option < Vec < LintPassObject > > ,
64
64
65
65
/// Lints indexed by name.
66
- by_name : HashMap < String , LintId > ,
66
+ by_name : HashMap < String , TargetLint > ,
67
67
68
68
/// Current levels of each lint, and where they were set.
69
69
levels : HashMap < LintId , LevelSource > ,
@@ -73,6 +73,15 @@ pub struct LintStore {
73
73
lint_groups : HashMap < & ' static str , ( Vec < LintId > , bool ) > ,
74
74
}
75
75
76
+ /// The targed of the `by_name` map, which accounts for renaming/deprecation.
77
+ enum TargetLint {
78
+ /// A direct lint target
79
+ Id ( LintId ) ,
80
+
81
+ /// Temporary renaming, used for easing migration pain; see #16545
82
+ Renamed ( String , LintId ) ,
83
+ }
84
+
76
85
impl LintStore {
77
86
fn get_level_source ( & self , lint : LintId ) -> LevelSource {
78
87
match self . levels . find ( & lint) {
@@ -115,7 +124,7 @@ impl LintStore {
115
124
self . lints . push ( ( * lint, from_plugin) ) ;
116
125
117
126
let id = LintId :: of ( * lint) ;
118
- if !self . by_name . insert ( lint. name_lower ( ) , id ) {
127
+ if !self . by_name . insert ( lint. name_lower ( ) , Id ( id ) ) {
119
128
let msg = format ! ( "duplicate specification of lint {}" , lint. name_lower( ) ) ;
120
129
match ( sess, from_plugin) {
121
130
// We load builtin lints first, so a duplicate is a compiler bug.
@@ -154,6 +163,14 @@ impl LintStore {
154
163
}
155
164
}
156
165
166
+ fn register_renamed ( & mut self , old_name : & str , new_name : & str ) {
167
+ let target = match self . by_name . find_equiv ( & new_name) {
168
+ Some ( & Id ( lint_id) ) => lint_id. clone ( ) ,
169
+ _ => fail ! ( "invalid lint renaming of {} to {}" , old_name, new_name)
170
+ } ;
171
+ self . by_name . insert ( old_name. to_string ( ) , Renamed ( new_name. to_string ( ) , target) ) ;
172
+ }
173
+
157
174
pub fn register_builtin ( & mut self , sess : Option < & Session > ) {
158
175
macro_rules! add_builtin ( ( $sess: ident, $( $name: ident) ,* , ) => (
159
176
{ $(
@@ -208,12 +225,59 @@ impl LintStore {
208
225
209
226
// We have one lint pass defined in this module.
210
227
self . register_pass ( sess, false , box GatherNodeLevels as LintPassObject ) ;
228
+
229
+ // Insert temporary renamings for a one-time deprecation (#16545)
230
+ self . register_renamed ( "unnecessary_typecast" , "unused_typecasts" ) ;
231
+ self . register_renamed ( "unsigned_negate" , "unsigned_negation" ) ;
232
+ self . register_renamed ( "type_limits" , "unused_comparisons" ) ;
233
+ self . register_renamed ( "type_overflow" , "overflowing_literals" ) ;
234
+ self . register_renamed ( "ctypes" , "improper_ctypes" ) ;
235
+ self . register_renamed ( "owned_heap_memory" , "box_pointers" ) ;
236
+ self . register_renamed ( "unused_attribute" , "unused_attributes" ) ;
237
+ self . register_renamed ( "path_statement" , "path_statements" ) ;
238
+ self . register_renamed ( "unused_result" , "unused_results" ) ;
239
+ self . register_renamed ( "non_uppercase_statics" , "non_upper_case_globals" ) ;
240
+ self . register_renamed ( "unnecessary_parens" , "unused_parens" ) ;
241
+ self . register_renamed ( "unnecessary_import_braces" , "unused_import_braces" ) ;
242
+ self . register_renamed ( "unsafe_block" , "unsafe_blocks" ) ;
243
+ self . register_renamed ( "unnecessary_allocation" , "unused_allocation" ) ;
244
+ self . register_renamed ( "missing_doc" , "missing_docs" ) ;
245
+ self . register_renamed ( "unused_extern_crate" , "unused_extern_crates" ) ;
246
+ self . register_renamed ( "unnecessary_qualification" , "unused_qualifications" ) ;
247
+ self . register_renamed ( "unrecognized_lint" , "unknown_lints" ) ;
248
+ self . register_renamed ( "unused_variable" , "unused_variables" ) ;
249
+ self . register_renamed ( "dead_assignment" , "unused_assignments" ) ;
250
+ self . register_renamed ( "unknown_crate_type" , "unknown_crate_types" ) ;
251
+ self . register_renamed ( "variant_size_difference" , "variant_size_differences" ) ;
252
+ self . register_renamed ( "transmute_fat_ptr" , "fat_ptr_transmutes" ) ;
253
+
254
+ }
255
+
256
+ #[ allow( unused_variable) ]
257
+ fn find_lint ( & self , lint_name : & str , sess : & Session , span : Option < Span > )
258
+ -> Option < LintId >
259
+ {
260
+ match self . by_name . find_equiv ( & lint_name) {
261
+ Some ( & Id ( lint_id) ) => Some ( lint_id) ,
262
+ Some ( & Renamed ( ref new_name, lint_id) ) => {
263
+ // NOTE(stage0): add the following code after the next snapshot
264
+
265
+ // let warning = format!("lint {} has been renamed to {}",
266
+ // lint_name, new_name);
267
+ // match span {
268
+ // Some(span) => sess.span_warn(span, warning.as_slice()),
269
+ // None => sess.warn(warning.as_slice()),
270
+ // };
271
+ Some ( lint_id)
272
+ }
273
+ None => None
274
+ }
211
275
}
212
276
213
277
pub fn process_command_line ( & mut self , sess : & Session ) {
214
278
for & ( ref lint_name, level) in sess. opts . lint_opts . iter ( ) {
215
- match self . by_name . find_equiv ( & lint_name. as_slice ( ) ) {
216
- Some ( & lint_id) => self . set_level ( lint_id, ( level, CommandLine ) ) ,
279
+ match self . find_lint ( lint_name. as_slice ( ) , sess , None ) {
280
+ Some ( lint_id) => self . set_level ( lint_id, ( level, CommandLine ) ) ,
217
281
None => {
218
282
match self . lint_groups . iter ( ) . map ( |( & x, pair) | ( x, pair. ref0 ( ) . clone ( ) ) )
219
283
. collect :: < HashMap < & ' static str , Vec < LintId > > > ( )
@@ -421,8 +485,8 @@ impl<'a, 'tcx> Context<'a, 'tcx> {
421
485
continue ;
422
486
}
423
487
Ok ( ( lint_name, level, span) ) => {
424
- match self . lints . by_name . find_equiv ( & lint_name. get ( ) ) {
425
- Some ( & lint_id) => vec ! [ ( lint_id, level, span) ] ,
488
+ match self . lints . find_lint ( lint_name. get ( ) , & self . tcx . sess , Some ( span ) ) {
489
+ Some ( lint_id) => vec ! [ ( lint_id, level, span) ] ,
426
490
None => {
427
491
match self . lints . lint_groups . find_equiv ( & lint_name. get ( ) ) {
428
492
Some ( & ( ref v, _) ) => v. iter ( )
0 commit comments