X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=clippy_lints%2Fsrc%2Fshadow.rs;h=e43b591a9cdc83e8211f0e3ddf7e563dede16733;hb=6feed2713c7740eb5868eba43745bc508b8b77aa;hp=c99b00bb98f9db85ad4fa8da9c70d7f0609b0809;hpb=5b64f6875e13529adf09a3447513711b8d71df34;p=rust.git diff --git a/clippy_lints/src/shadow.rs b/clippy_lints/src/shadow.rs index c99b00bb98f..e43b591a9cd 100644 --- a/clippy_lints/src/shadow.rs +++ b/clippy_lints/src/shadow.rs @@ -4,87 +4,80 @@ use rustc::hir::*; use rustc::lint::{in_external_macro, LateContext, LateLintPass, LintArray, LintContext, LintPass}; use rustc::ty; -use rustc::{declare_tool_lint, lint_array}; +use rustc::{declare_lint_pass, declare_tool_lint}; use syntax::source_map::Span; -/// **What it does:** Checks for bindings that shadow other bindings already in -/// scope, while just changing reference level or mutability. -/// -/// **Why is this bad?** Not much, in fact it's a very common pattern in Rust -/// code. Still, some may opt to avoid it in their code base, they can set this -/// lint to `Warn`. -/// -/// **Known problems:** This lint, as the other shadowing related lints, -/// currently only catches very simple patterns. -/// -/// **Example:** -/// ```rust -/// let x = &x; -/// ``` declare_clippy_lint! { + /// **What it does:** Checks for bindings that shadow other bindings already in + /// scope, while just changing reference level or mutability. + /// + /// **Why is this bad?** Not much, in fact it's a very common pattern in Rust + /// code. Still, some may opt to avoid it in their code base, they can set this + /// lint to `Warn`. + /// + /// **Known problems:** This lint, as the other shadowing related lints, + /// currently only catches very simple patterns. + /// + /// **Example:** + /// ```rust + /// let x = &x; + /// ``` pub SHADOW_SAME, restriction, - "rebinding a name to itself, e.g. `let mut x = &mut x`" + "rebinding a name to itself, e.g., `let mut x = &mut x`" } -/// **What it does:** Checks for bindings that shadow other bindings already in -/// scope, while reusing the original value. -/// -/// **Why is this bad?** Not too much, in fact it's a common pattern in Rust -/// code. Still, some argue that name shadowing like this hurts readability, -/// because a value may be bound to different things depending on position in -/// the code. -/// -/// **Known problems:** This lint, as the other shadowing related lints, -/// currently only catches very simple patterns. -/// -/// **Example:** -/// ```rust -/// let x = x + 1; -/// ``` -/// use different variable name: -/// ```rust -/// let y = x + 1; -/// ``` declare_clippy_lint! { + /// **What it does:** Checks for bindings that shadow other bindings already in + /// scope, while reusing the original value. + /// + /// **Why is this bad?** Not too much, in fact it's a common pattern in Rust + /// code. Still, some argue that name shadowing like this hurts readability, + /// because a value may be bound to different things depending on position in + /// the code. + /// + /// **Known problems:** This lint, as the other shadowing related lints, + /// currently only catches very simple patterns. + /// + /// **Example:** + /// ```rust + /// let x = x + 1; + /// ``` + /// use different variable name: + /// ```rust + /// let y = x + 1; + /// ``` pub SHADOW_REUSE, restriction, - "rebinding a name to an expression that re-uses the original value, e.g. `let x = x + 1`" + "rebinding a name to an expression that re-uses the original value, e.g., `let x = x + 1`" } -/// **What it does:** Checks for bindings that shadow other bindings already in -/// scope, either without a initialization or with one that does not even use -/// the original value. -/// -/// **Why is this bad?** Name shadowing can hurt readability, especially in -/// large code bases, because it is easy to lose track of the active binding at -/// any place in the code. This can be alleviated by either giving more specific -/// names to bindings or introducing more scopes to contain the bindings. -/// -/// **Known problems:** This lint, as the other shadowing related lints, -/// currently only catches very simple patterns. -/// -/// **Example:** -/// ```rust -/// let x = y; -/// let x = z; // shadows the earlier binding -/// ``` declare_clippy_lint! { + /// **What it does:** Checks for bindings that shadow other bindings already in + /// scope, either without a initialization or with one that does not even use + /// the original value. + /// + /// **Why is this bad?** Name shadowing can hurt readability, especially in + /// large code bases, because it is easy to lose track of the active binding at + /// any place in the code. This can be alleviated by either giving more specific + /// names to bindings or introducing more scopes to contain the bindings. + /// + /// **Known problems:** This lint, as the other shadowing related lints, + /// currently only catches very simple patterns. + /// + /// **Example:** + /// ```rust + /// let x = y; + /// let x = z; // shadows the earlier binding + /// ``` pub SHADOW_UNRELATED, pedantic, "rebinding a name without even using the original value" } -#[derive(Copy, Clone)] -pub struct Pass; +declare_lint_pass!(Shadow => [SHADOW_SAME, SHADOW_REUSE, SHADOW_UNRELATED]); -impl LintPass for Pass { - fn get_lints(&self) -> LintArray { - lint_array!(SHADOW_SAME, SHADOW_REUSE, SHADOW_UNRELATED) - } -} - -impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass { +impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Shadow { fn check_fn( &mut self, cx: &LateContext<'a, 'tcx>, @@ -92,7 +85,7 @@ fn check_fn( decl: &'tcx FnDecl, body: &'tcx Body, _: Span, - _: NodeId, + _: HirId, ) { if in_external_macro(cx.sess(), body.value.span) { return; @@ -104,7 +97,7 @@ fn check_fn( fn check_fn<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, decl: &'tcx FnDecl, body: &'tcx Body) { let mut bindings = Vec::new(); for arg in iter_input_pats(decl, body) { - if let PatKind::Binding(_, _, ident, _) = arg.pat.node { + if let PatKind::Binding(.., ident, _) = arg.pat.node { bindings.push((ident.name, ident.span)) } } @@ -152,7 +145,7 @@ fn check_local<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, local: &'tcx Local, binding } fn is_binding(cx: &LateContext<'_, '_>, pat_id: HirId) -> bool { - let var_ty = cx.tables.node_id_to_type(pat_id); + let var_ty = cx.tables.node_type(pat_id); match var_ty.sty { ty::Adt(..) => false, _ => true, @@ -168,7 +161,7 @@ fn check_pat<'a, 'tcx>( ) { // TODO: match more stuff / destructuring match pat.node { - PatKind::Binding(_, _, ident, ref inner) => { + PatKind::Binding(.., ident, ref inner) => { let name = ident.name; if is_binding(cx, pat.hir_id) { let mut new_binding = true;