mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-23 05:03:21 +00:00
Merge pull request #2415 from HMPerson1/fix-2356
Fix `ImplItem`s being ignored
This commit is contained in:
commit
7fddc6116e
9 changed files with 146 additions and 17 deletions
|
@ -1,4 +1,4 @@
|
|||
use syntax::ast::{Item, ItemKind, Ty, TyKind};
|
||||
use syntax::ast::*;
|
||||
use rustc::lint::{EarlyContext, EarlyLintPass, LintArray, LintPass};
|
||||
use utils::{in_macro, snippet, span_lint_and_then};
|
||||
|
||||
|
@ -86,4 +86,22 @@ impl EarlyLintPass for StaticConst {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn check_trait_item(&mut self, cx: &EarlyContext, item: &TraitItem) {
|
||||
if !in_macro(item.span) {
|
||||
// Match only constants...
|
||||
if let TraitItemKind::Const(ref var_type, _) = item.node {
|
||||
self.visit_type(var_type, cx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn check_impl_item(&mut self, cx: &EarlyContext, item: &ImplItem) {
|
||||
if !in_macro(item.span) {
|
||||
// Match only constants...
|
||||
if let ImplItemKind::Const(ref var_type, _) = item.node {
|
||||
self.visit_type(var_type, cx);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -313,22 +313,33 @@ impl<'a, 'tcx> Visitor<'tcx> for SimilarNamesLocalVisitor<'a, 'tcx> {
|
|||
impl EarlyLintPass for NonExpressiveNames {
|
||||
fn check_item(&mut self, cx: &EarlyContext, item: &Item) {
|
||||
if let ItemKind::Fn(ref decl, _, _, _, _, ref blk) = item.node {
|
||||
if !attr::contains_name(&item.attrs, "test") {
|
||||
let mut visitor = SimilarNamesLocalVisitor {
|
||||
names: Vec::new(),
|
||||
cx: cx,
|
||||
lint: self,
|
||||
single_char_names: Vec::new(),
|
||||
};
|
||||
// initialize with function arguments
|
||||
for arg in &decl.inputs {
|
||||
SimilarNamesNameVisitor(&mut visitor).visit_pat(&arg.pat);
|
||||
}
|
||||
// walk all other bindings
|
||||
walk_block(&mut visitor, blk);
|
||||
}
|
||||
do_check(self, cx, &item.attrs, decl, blk);
|
||||
}
|
||||
}
|
||||
|
||||
fn check_impl_item(&mut self, cx: &EarlyContext, item: &ImplItem) {
|
||||
if let ImplItemKind::Method(ref sig, ref blk) = item.node {
|
||||
do_check(self, cx, &item.attrs, &sig.decl, blk);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn do_check(lint: &mut NonExpressiveNames, cx: &EarlyContext, attrs: &[Attribute], decl: &FnDecl, blk: &Block) {
|
||||
if !attr::contains_name(attrs, "test") {
|
||||
let mut visitor = SimilarNamesLocalVisitor {
|
||||
names: Vec::new(),
|
||||
cx: cx,
|
||||
lint: lint,
|
||||
single_char_names: Vec::new(),
|
||||
};
|
||||
// initialize with function arguments
|
||||
for arg in &decl.inputs {
|
||||
SimilarNamesNameVisitor(&mut visitor).visit_pat(&arg.pat);
|
||||
}
|
||||
// walk all other bindings
|
||||
walk_block(&mut visitor, blk);
|
||||
}
|
||||
}
|
||||
|
||||
/// Precondition: `a_name.chars().count() < b_name.chars().count()`.
|
||||
|
|
|
@ -518,6 +518,9 @@ pub fn get_enclosing_block<'a, 'tcx: 'a>(cx: &LateContext<'a, 'tcx>, node: NodeI
|
|||
Node::NodeItem(&Item {
|
||||
node: ItemFn(_, _, _, _, _, eid),
|
||||
..
|
||||
}) | Node::NodeImplItem(&ImplItem {
|
||||
node: ImplItemKind::Method(_, eid),
|
||||
..
|
||||
}) => match cx.tcx.hir.body(eid).value.node {
|
||||
ExprBlock(ref block) => Some(block),
|
||||
_ => None,
|
||||
|
|
|
@ -35,3 +35,15 @@ fn main() {
|
|||
println!("{:?}", VAR_HEIGHT);
|
||||
println!("{}", false_positive);
|
||||
}
|
||||
|
||||
trait Bar {
|
||||
const TRAIT_VAR: &'static str;
|
||||
}
|
||||
|
||||
impl Foo {
|
||||
const IMPL_VAR: &'static str = "var";
|
||||
}
|
||||
|
||||
impl Bar for Foo {
|
||||
const TRAIT_VAR: &'static str = "foo";
|
||||
}
|
||||
|
|
|
@ -78,5 +78,23 @@ error: Constants have by default a `'static` lifetime
|
|||
24 | const VAR_ARRAY: &'static [u8; 1] = b"T"; // ERROR Consider removing 'static.
|
||||
| -^^^^^^^-------- help: consider removing `'static`: `&[u8; 1]`
|
||||
|
||||
error: aborting due to 13 previous errors
|
||||
error: Constants have by default a `'static` lifetime
|
||||
--> $DIR/const_static_lifetime.rs:40:23
|
||||
|
|
||||
40 | const TRAIT_VAR: &'static str;
|
||||
| -^^^^^^^---- help: consider removing `'static`: `&str`
|
||||
|
||||
error: Constants have by default a `'static` lifetime
|
||||
--> $DIR/const_static_lifetime.rs:44:22
|
||||
|
|
||||
44 | const IMPL_VAR: &'static str = "var";
|
||||
| -^^^^^^^---- help: consider removing `'static`: `&str`
|
||||
|
||||
error: Constants have by default a `'static` lifetime
|
||||
--> $DIR/const_static_lifetime.rs:48:23
|
||||
|
|
||||
48 | const TRAIT_VAR: &'static str = "foo";
|
||||
| -^^^^^^^---- help: consider removing `'static`: `&str`
|
||||
|
||||
error: aborting due to 16 previous errors
|
||||
|
||||
|
|
24
tests/ui/issue_2356.rs
Normal file
24
tests/ui/issue_2356.rs
Normal file
|
@ -0,0 +1,24 @@
|
|||
#![deny(while_let_on_iterator)]
|
||||
|
||||
use std::iter::Iterator;
|
||||
|
||||
struct Foo;
|
||||
|
||||
impl Foo {
|
||||
fn foo1<I: Iterator<Item = usize>>(mut it: I) {
|
||||
while let Some(_) = it.next() {
|
||||
println!("{:?}", it.size_hint());
|
||||
}
|
||||
}
|
||||
|
||||
fn foo2<I: Iterator<Item = usize>>(mut it: I) {
|
||||
while let Some(e) = it.next() {
|
||||
println!("{:?}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
Foo::foo1(vec![].into_iter());
|
||||
Foo::foo2(vec![].into_iter());
|
||||
}
|
14
tests/ui/issue_2356.stderr
Normal file
14
tests/ui/issue_2356.stderr
Normal file
|
@ -0,0 +1,14 @@
|
|||
error: this loop could be written as a `for` loop
|
||||
--> $DIR/issue_2356.rs:15:29
|
||||
|
|
||||
15 | while let Some(e) = it.next() {
|
||||
| ^^^^^^^^^ help: try: `for e in it { .. }`
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/issue_2356.rs:1:9
|
||||
|
|
||||
1 | #![deny(while_let_on_iterator)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
|
@ -141,3 +141,14 @@ fn underscores_and_numbers() {
|
|||
let __1___2 = 12; //~ERROR Consider a more descriptive name
|
||||
let _1_ok= 1;
|
||||
}
|
||||
|
||||
struct Bar;
|
||||
|
||||
impl Bar {
|
||||
fn bar() {
|
||||
let _1 = 1;
|
||||
let ____1 = 1;
|
||||
let __1___2 = 12;
|
||||
let _1_ok= 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -149,5 +149,23 @@ error: consider choosing a more descriptive name
|
|||
141 | let __1___2 = 12; //~ERROR Consider a more descriptive name
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to 14 previous errors
|
||||
error: consider choosing a more descriptive name
|
||||
--> $DIR/non_expressive_names.rs:149:13
|
||||
|
|
||||
149 | let _1 = 1;
|
||||
| ^^
|
||||
|
||||
error: consider choosing a more descriptive name
|
||||
--> $DIR/non_expressive_names.rs:150:13
|
||||
|
|
||||
150 | let ____1 = 1;
|
||||
| ^^^^^
|
||||
|
||||
error: consider choosing a more descriptive name
|
||||
--> $DIR/non_expressive_names.rs:151:13
|
||||
|
|
||||
151 | let __1___2 = 12;
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to 17 previous errors
|
||||
|
||||
|
|
Loading…
Reference in a new issue