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