From 5384f0fd3e76013f4a3a72dcb3f017ff943ff325 Mon Sep 17 00:00:00 2001 From: varkor Date: Sat, 15 Sep 2018 15:26:45 +0100 Subject: [PATCH 1/3] Make `bad_style` a silent alias for `nonstandard_style` Now only `nonstandard_style` is suggested in `rustc -W help`, but `bad_style` will not produce a warning. --- src/librustc/lint/context.rs | 51 ++++++++++++++++++++++++------------ src/librustc_lint/lib.rs | 22 +++++++--------- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs index e22792305a053..f498935a8151f 100644 --- a/src/librustc/lint/context.rs +++ b/src/librustc/lint/context.rs @@ -69,8 +69,9 @@ pub struct LintStore { /// Map of registered lint groups to what lints they expand to. The first /// bool is true if the lint group was added by a plugin. The optional string - /// is used to store the new names of deprecated lint group names. - lint_groups: FxHashMap<&'static str, (Vec, bool, Option<&'static str>)>, + /// is used to store the new names of deprecated lint group names and is paired + /// with `true` if the deprecation is silent. + lint_groups: FxHashMap<&'static str, (Vec, bool, Option<(&'static str, bool)>)>, /// Extra info for future incompatibility lints, describing the /// issue or RFC that caused the incompatibility. @@ -160,9 +161,9 @@ impl LintStore { } pub fn get_lint_groups<'t>(&'t self) -> Vec<(&'static str, Vec, bool)> { - self.lint_groups.iter().map(|(k, v)| (*k, - v.0.clone(), - v.1)).collect() + self.lint_groups.iter() + .filter(|(_, (_, _, d))| d.is_none()) // Don't display deprecated lint groups. + .map(|(k, v)| (*k, v.0.clone(), v.1)).collect() } pub fn register_early_pass(&mut self, @@ -245,6 +246,14 @@ impl LintStore { self.future_incompatible.get(&id) } + pub fn register_group_alias( + &mut self, + lint_name: &'static str, + alias: &'static str, + ) { + self.lint_groups.insert(alias, (vec![], false, Some((lint_name, true)))); + } + pub fn register_group( &mut self, sess: Option<&Session>, @@ -259,7 +268,7 @@ impl LintStore { .is_none(); if let Some(deprecated) = deprecated_name { self.lint_groups - .insert(deprecated, (vec![], from_plugin, Some(name))); + .insert(deprecated, (vec![], from_plugin, Some((name, false)))); } if !new { @@ -392,12 +401,16 @@ impl LintStore { None => self.check_tool_name_for_backwards_compat(&complete_name, "clippy"), Some(ids) => { // Check if the lint group name is deprecated - if let Some(new_name) = ids.2 { + if let Some((new_name, silent)) = ids.2 { let lint_ids = self.lint_groups.get(new_name).unwrap(); - return CheckLintNameResult::Tool(Err(( - Some(&lint_ids.0), - new_name.to_string(), - ))); + return if silent { + CheckLintNameResult::Ok(&lint_ids.0) + } else { + CheckLintNameResult::Tool(Err(( + Some(&lint_ids.0), + new_name.to_string(), + ))) + }; } CheckLintNameResult::Ok(&ids.0) } @@ -417,13 +430,17 @@ impl LintStore { // Now we are sure, that this lint exists nowhere None => CheckLintNameResult::NoLint, Some(ids) => { - // Reaching this would be weird, but lets cover this case anyway - if let Some(new_name) = ids.2 { + // Reaching this would be weird, but let's cover this case anyway + if let Some((new_name, silent)) = ids.2 { let lint_ids = self.lint_groups.get(new_name).unwrap(); - return CheckLintNameResult::Tool(Err(( - Some(&lint_ids.0), - new_name.to_string(), - ))); + return if silent { + CheckLintNameResult::Tool(Err((Some(&lint_ids.0), complete_name))) + } else { + CheckLintNameResult::Tool(Err(( + Some(&lint_ids.0), + new_name.to_string(), + ))) + }; } CheckLintNameResult::Tool(Err((Some(&ids.0), complete_name))) } diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index 9ed69a2dc9b8e..3b935ac5aa886 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -82,30 +82,30 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { ($sess:ident, $($name:ident),*,) => ( {$( store.register_early_pass($sess, false, box $name); - )*} - ) + )*} + ) } macro_rules! add_pre_expansion_builtin { ($sess:ident, $($name:ident),*,) => ( {$( store.register_pre_expansion_pass($sess, box $name); - )*} - ) + )*} + ) } macro_rules! add_early_builtin_with_new { ($sess:ident, $($name:ident),*,) => ( {$( store.register_early_pass($sess, false, box $name::new()); - )*} - ) + )*} + ) } macro_rules! add_lint_group { ($sess:ident, $name:expr, $($lint:ident),*) => ( store.register_group($sess, false, $name, None, vec![$(LintId::of($lint)),*]); - ) + ) } add_pre_expansion_builtin!(sess, @@ -159,12 +159,6 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { store.register_late_pass(sess, false, box BuiltinCombinedLateLintPass::new()); - add_lint_group!(sess, - "bad_style", - NON_CAMEL_CASE_TYPES, - NON_SNAKE_CASE, - NON_UPPER_CASE_GLOBALS); - add_lint_group!(sess, "nonstandard_style", NON_CAMEL_CASE_TYPES, @@ -353,6 +347,8 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate"); store.register_removed("negate_unsigned", "cast a signed value instead"); store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok"); + // Register lint group aliases + store.register_group_alias("nonstandard_style", "bad_style"); // This was renamed to raw_pointer_derive, which was then removed, // so it is also considered removed store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok"); From 52c0f13ff164dc2e05b488e3dec939dee25e2745 Mon Sep 17 00:00:00 2001 From: varkor Date: Sat, 15 Sep 2018 17:05:52 +0100 Subject: [PATCH 2/3] Support deprecated lints in find_lints --- src/librustc/lint/context.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs index f498935a8151f..c633ae57fa9e3 100644 --- a/src/librustc/lint/context.rs +++ b/src/librustc/lint/context.rs @@ -297,7 +297,7 @@ impl LintStore { self.by_name.insert(name.into(), Removed(reason.into())); } - pub fn find_lints(&self, lint_name: &str) -> Result, FindLintError> { + pub fn find_lints(&self, mut lint_name: &str) -> Result, FindLintError> { match self.by_name.get(lint_name) { Some(&Id(lint_id)) => Ok(vec![lint_id]), Some(&Renamed(_, lint_id)) => { @@ -307,9 +307,17 @@ impl LintStore { Err(FindLintError::Removed) }, None => { - match self.lint_groups.get(lint_name) { - Some(v) => Ok(v.0.clone()), - None => Err(FindLintError::Removed) + loop { + return match self.lint_groups.get(lint_name) { + Some((ids, _, depr)) => { + if let Some((name, _)) = depr { + lint_name = name; + continue; + } + Ok(ids.clone()) + } + None => Err(FindLintError::Removed) + }; } } } From 15ecd1973ae83fcf00ba3a9b4290ba05ee1eeb5a Mon Sep 17 00:00:00 2001 From: varkor Date: Sat, 15 Sep 2018 17:32:24 +0100 Subject: [PATCH 3/3] Add `LintGroup` and `LintAlias` --- src/librustc/lint/context.rs | 90 +++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs index c633ae57fa9e3..a8f43f729748c 100644 --- a/src/librustc/lint/context.rs +++ b/src/librustc/lint/context.rs @@ -67,11 +67,8 @@ pub struct LintStore { /// Lints indexed by name. by_name: FxHashMap, - /// Map of registered lint groups to what lints they expand to. The first - /// bool is true if the lint group was added by a plugin. The optional string - /// is used to store the new names of deprecated lint group names and is paired - /// with `true` if the deprecation is silent. - lint_groups: FxHashMap<&'static str, (Vec, bool, Option<(&'static str, bool)>)>, + /// Map of registered lint groups to what lints they expand to. + lint_groups: FxHashMap<&'static str, LintGroup>, /// Extra info for future incompatibility lints, describing the /// issue or RFC that caused the incompatibility. @@ -128,6 +125,18 @@ pub enum FindLintError { Removed, } +struct LintAlias { + name: &'static str, + /// Whether deprecation warnings should be suppressed for this alias. + silent: bool, +} + +struct LintGroup { + lint_ids: Vec, + from_plugin: bool, + depr: Option, +} + pub enum CheckLintNameResult<'a> { Ok(&'a [LintId]), /// Lint doesn't exist @@ -162,8 +171,14 @@ impl LintStore { pub fn get_lint_groups<'t>(&'t self) -> Vec<(&'static str, Vec, bool)> { self.lint_groups.iter() - .filter(|(_, (_, _, d))| d.is_none()) // Don't display deprecated lint groups. - .map(|(k, v)| (*k, v.0.clone(), v.1)).collect() + .filter(|(_, LintGroup { depr, .. })| { + // Don't display deprecated lint groups. + depr.is_none() + }) + .map(|(k, LintGroup { lint_ids, from_plugin, .. })| { + (*k, lint_ids.clone(), *from_plugin) + }) + .collect() } pub fn register_early_pass(&mut self, @@ -251,7 +266,11 @@ impl LintStore { lint_name: &'static str, alias: &'static str, ) { - self.lint_groups.insert(alias, (vec![], false, Some((lint_name, true)))); + self.lint_groups.insert(alias, LintGroup { + lint_ids: vec![], + from_plugin: false, + depr: Some(LintAlias { name: lint_name, silent: true }), + }); } pub fn register_group( @@ -264,11 +283,18 @@ impl LintStore { ) { let new = self .lint_groups - .insert(name, (to, from_plugin, None)) + .insert(name, LintGroup { + lint_ids: to, + from_plugin, + depr: None, + }) .is_none(); if let Some(deprecated) = deprecated_name { - self.lint_groups - .insert(deprecated, (vec![], from_plugin, Some((name, false)))); + self.lint_groups.insert(deprecated, LintGroup { + lint_ids: vec![], + from_plugin, + depr: Some(LintAlias { name, silent: false }), + }); } if !new { @@ -309,12 +335,12 @@ impl LintStore { None => { loop { return match self.lint_groups.get(lint_name) { - Some((ids, _, depr)) => { - if let Some((name, _)) = depr { + Some(LintGroup {lint_ids, depr, .. }) => { + if let Some(LintAlias { name, .. }) = depr { lint_name = name; continue; } - Ok(ids.clone()) + Ok(lint_ids.clone()) } None => Err(FindLintError::Removed) }; @@ -383,7 +409,9 @@ impl LintStore { match self.by_name.get(&complete_name) { None => match self.lint_groups.get(&*complete_name) { None => return CheckLintNameResult::Tool(Err((None, String::new()))), - Some(ids) => return CheckLintNameResult::Tool(Ok(&ids.0)), + Some(LintGroup { lint_ids, .. }) => { + return CheckLintNameResult::Tool(Ok(&lint_ids)); + } }, Some(&Id(ref id)) => return CheckLintNameResult::Tool(Ok(slice::from_ref(id))), // If the lint was registered as removed or renamed by the lint tool, we don't need @@ -407,20 +435,20 @@ impl LintStore { // If neither the lint, nor the lint group exists check if there is a `clippy::` // variant of this lint None => self.check_tool_name_for_backwards_compat(&complete_name, "clippy"), - Some(ids) => { + Some(LintGroup { lint_ids, depr, .. }) => { // Check if the lint group name is deprecated - if let Some((new_name, silent)) = ids.2 { - let lint_ids = self.lint_groups.get(new_name).unwrap(); - return if silent { - CheckLintNameResult::Ok(&lint_ids.0) + if let Some(LintAlias { name, silent }) = depr { + let LintGroup { lint_ids, .. } = self.lint_groups.get(name).unwrap(); + return if *silent { + CheckLintNameResult::Ok(&lint_ids) } else { CheckLintNameResult::Tool(Err(( - Some(&lint_ids.0), - new_name.to_string(), + Some(&lint_ids), + name.to_string(), ))) }; } - CheckLintNameResult::Ok(&ids.0) + CheckLintNameResult::Ok(&lint_ids) } }, Some(&Id(ref id)) => CheckLintNameResult::Ok(slice::from_ref(id)), @@ -437,20 +465,20 @@ impl LintStore { None => match self.lint_groups.get(&*complete_name) { // Now we are sure, that this lint exists nowhere None => CheckLintNameResult::NoLint, - Some(ids) => { + Some(LintGroup { lint_ids, depr, .. }) => { // Reaching this would be weird, but let's cover this case anyway - if let Some((new_name, silent)) = ids.2 { - let lint_ids = self.lint_groups.get(new_name).unwrap(); - return if silent { - CheckLintNameResult::Tool(Err((Some(&lint_ids.0), complete_name))) + if let Some(LintAlias { name, silent }) = depr { + let LintGroup { lint_ids, .. } = self.lint_groups.get(name).unwrap(); + return if *silent { + CheckLintNameResult::Tool(Err((Some(&lint_ids), complete_name))) } else { CheckLintNameResult::Tool(Err(( - Some(&lint_ids.0), - new_name.to_string(), + Some(&lint_ids), + name.to_string(), ))) }; } - CheckLintNameResult::Tool(Err((Some(&ids.0), complete_name))) + CheckLintNameResult::Tool(Err((Some(&lint_ids), complete_name))) } }, Some(&Id(ref id)) => {