2023-07-17 03:19:29 -05:00
|
|
|
use clippy_utils::diagnostics::span_lint;
|
2024-07-11 08:44:03 -05:00
|
|
|
use clippy_utils::is_in_test;
|
2018-12-31 03:44:27 -06:00
|
|
|
use rustc_data_structures::fx::FxHashSet;
|
2024-07-11 08:44:03 -05:00
|
|
|
use rustc_hir::{Pat, PatKind};
|
2020-01-12 00:08:41 -06:00
|
|
|
use rustc_lint::{LateContext, LateLintPass};
|
2023-12-01 11:21:58 -06:00
|
|
|
use rustc_session::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
|
2023-11-02 11:35:56 -05:00
|
|
|
/// ```no_run
|
2019-03-05 10:50:33 -06:00
|
|
|
/// 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>,
|
2016-02-22 08:42:24 -06:00
|
|
|
}
|
|
|
|
|
2022-08-11 12:42:16 -05:00
|
|
|
impl DisallowedNames {
|
2023-11-16 12:13:24 -06:00
|
|
|
pub fn new(disallowed_names: &[String]) -> Self {
|
2021-07-01 11:17:38 -05:00
|
|
|
Self {
|
2023-11-16 12:13:24 -06:00
|
|
|
disallow: disallowed_names.iter().cloned().collect(),
|
2021-07-01 11:17:38 -05:00
|
|
|
}
|
|
|
|
}
|
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 {
|
2020-06-25 15:41:36 -05:00
|
|
|
fn check_pat(&mut self, cx: &LateContext<'tcx>, pat: &'tcx Pat<'_>) {
|
2024-07-11 08:44:03 -05:00
|
|
|
if let PatKind::Binding(.., ident, _) = pat.kind
|
|
|
|
&& self.disallow.contains(&ident.name.to_string())
|
|
|
|
&& !is_in_test(cx.tcx, pat.hir_id)
|
|
|
|
{
|
|
|
|
span_lint(
|
|
|
|
cx,
|
|
|
|
DISALLOWED_NAMES,
|
|
|
|
ident.span,
|
|
|
|
format!("use of a disallowed/placeholder name `{}`", ident.name),
|
|
|
|
);
|
2021-07-01 11:17:38 -05:00
|
|
|
}
|
|
|
|
}
|
2016-02-22 08:42:24 -06:00
|
|
|
}
|