2021-07-01 11:17:38 -05:00
|
|
|
use clippy_utils::{diagnostics::span_lint, is_test_module_or_function};
|
2018-12-31 03:44:27 -06:00
|
|
|
use rustc_data_structures::fx::FxHashSet;
|
2021-07-01 11:17:38 -05:00
|
|
|
use rustc_hir::{Item, Pat, PatKind};
|
2020-01-12 00:08:41 -06:00
|
|
|
use rustc_lint::{LateContext, LateLintPass};
|
2020-01-11 05:37:08 -06:00
|
|
|
use rustc_session::{declare_tool_lint, impl_lint_pass};
|
2016-02-22 08:42:24 -06:00
|
|
|
|
2018-03-28 08:24:26 -05:00
|
|
|
declare_clippy_lint! {
|
2021-07-29 05:16:06 -05:00
|
|
|
/// ### What it does
|
2022-08-11 12:42:16 -05:00
|
|
|
/// Checks for usage of disallowed names for variables, such
|
2019-03-05 10:50:33 -06:00
|
|
|
/// as `foo`.
|
|
|
|
///
|
2021-07-29 05:16:06 -05:00
|
|
|
/// ### Why is this bad?
|
|
|
|
/// These names are usually placeholder names and should be
|
2019-03-05 10:50:33 -06:00
|
|
|
/// avoided.
|
|
|
|
///
|
2021-07-29 05:16:06 -05:00
|
|
|
/// ### Example
|
2019-03-05 10:50:33 -06:00
|
|
|
/// ```rust
|
|
|
|
/// let foo = 3.14;
|
|
|
|
/// ```
|
2021-12-06 05:33:31 -06:00
|
|
|
#[clippy::version = "pre 1.29.0"]
|
2022-08-11 12:42:16 -05:00
|
|
|
pub DISALLOWED_NAMES,
|
2018-03-28 08:24:26 -05:00
|
|
|
style,
|
2022-08-11 12:42:16 -05:00
|
|
|
"usage of a disallowed/placeholder name"
|
2016-02-22 08:42:24 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
2022-08-11 12:42:16 -05:00
|
|
|
pub struct DisallowedNames {
|
|
|
|
disallow: FxHashSet<String>,
|
2021-07-01 11:17:38 -05:00
|
|
|
test_modules_deep: u32,
|
2016-02-22 08:42:24 -06:00
|
|
|
}
|
|
|
|
|
2022-08-11 12:42:16 -05:00
|
|
|
impl DisallowedNames {
|
|
|
|
pub fn new(disallow: FxHashSet<String>) -> Self {
|
2021-07-01 11:17:38 -05:00
|
|
|
Self {
|
2022-08-11 12:42:16 -05:00
|
|
|
disallow,
|
2021-07-01 11:17:38 -05:00
|
|
|
test_modules_deep: 0,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn in_test_module(&self) -> bool {
|
|
|
|
self.test_modules_deep != 0
|
2016-02-22 08:42:24 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-11 12:42:16 -05:00
|
|
|
impl_lint_pass!(DisallowedNames => [DISALLOWED_NAMES]);
|
2016-02-22 08:42:24 -06:00
|
|
|
|
2022-08-11 12:42:16 -05:00
|
|
|
impl<'tcx> LateLintPass<'tcx> for DisallowedNames {
|
2021-07-01 11:17:38 -05:00
|
|
|
fn check_item(&mut self, cx: &LateContext<'_>, item: &Item<'_>) {
|
|
|
|
if is_test_module_or_function(cx.tcx, item) {
|
|
|
|
self.test_modules_deep = self.test_modules_deep.saturating_add(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-25 15:41:36 -05:00
|
|
|
fn check_pat(&mut self, cx: &LateContext<'tcx>, pat: &'tcx Pat<'_>) {
|
2021-07-01 11:17:38 -05:00
|
|
|
// Check whether we are under the `test` attribute.
|
|
|
|
if self.in_test_module() {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-09-27 10:16:06 -05:00
|
|
|
if let PatKind::Binding(.., ident, _) = pat.kind {
|
2022-08-11 12:42:16 -05:00
|
|
|
if self.disallow.contains(&ident.name.to_string()) {
|
2017-08-09 02:30:56 -05:00
|
|
|
span_lint(
|
|
|
|
cx,
|
2022-08-11 12:42:16 -05:00
|
|
|
DISALLOWED_NAMES,
|
2017-08-09 02:30:56 -05:00
|
|
|
ident.span,
|
2022-08-11 12:42:16 -05:00
|
|
|
&format!("use of a disallowed/placeholder name `{}`", ident.name),
|
2017-08-09 02:30:56 -05:00
|
|
|
);
|
2016-02-22 08:42:24 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-07-01 11:17:38 -05:00
|
|
|
|
|
|
|
fn check_item_post(&mut self, cx: &LateContext<'_>, item: &Item<'_>) {
|
|
|
|
if is_test_module_or_function(cx.tcx, item) {
|
|
|
|
self.test_modules_deep = self.test_modules_deep.saturating_sub(1);
|
|
|
|
}
|
|
|
|
}
|
2016-02-22 08:42:24 -06:00
|
|
|
}
|