clippy 0.0.6

A bunch of helpful lints to avoid common pitfalls in Rust
#![feature(plugin)]
#![plugin(clippy)]

struct One;

#[deny(len_without_is_empty)]
impl One {
	fn len(self: &Self) -> isize { //~ERROR Item 'One' has a '.len(_: &Self)'
		1
	}
}

#[deny(len_without_is_empty)]
trait TraitsToo {
	fn len(self: &Self) -> isize; //~ERROR Trait 'TraitsToo' has a '.len(_:
}

impl TraitsToo for One {
	fn len(self: &Self) -> isize {
		0
	}
}

struct HasIsEmpty;

#[deny(len_without_is_empty)]
impl HasIsEmpty {
	fn len(self: &Self) -> isize {
		1
	}

	fn is_empty(self: &Self) -> bool {
		false
	}
}

struct Wither;

#[deny(len_without_is_empty)]
trait WithIsEmpty {
	fn len(self: &Self) -> isize;
	fn is_empty(self: &Self) -> bool;
}

impl WithIsEmpty for Wither {
	fn len(self: &Self) -> isize {
		1
	}

	fn is_empty(self: &Self) -> bool {
		false
	}
}

struct HasWrongIsEmpty;

#[deny(len_without_is_empty)]
impl HasWrongIsEmpty {
	fn len(self: &Self) -> isize { //~ERROR Item 'HasWrongIsEmpty' has a '.len(_: &Self)'
		1
	}
	
	#[allow(dead_code, unused)]
	fn is_empty(self: &Self, x : u32) -> bool {
		false
	}
}

#[deny(len_zero)]
fn main() {
	let x = [1, 2];
	if x.len() == 0 { //~ERROR Consider replacing the len comparison
		println!("This should not happen!");
	}
	
	let y = One;
	if y.len()  == 0 { //no error because One does not have .is_empty()
		println!("This should not happen either!");
	}
	
	let z : &TraitsToo = &y;
	if z.len() > 0 { //no error, because TraitsToo has no .is_empty() method
		println!("Nor should this!");
	}
	
	let hie = HasIsEmpty;
	if hie.len() == 0 { //~ERROR Consider replacing the len comparison
		println!("Or this!");
	}
	assert!(!hie.is_empty());
	
	let wie : &WithIsEmpty = &Wither;
	if wie.len() == 0 { //~ERROR Consider replacing the len comparison
		println!("Or this!");
	}
	assert!(!wie.is_empty());
	
	let hwie = HasWrongIsEmpty;
	if hwie.len() == 0 { //no error as HasWrongIsEmpty does not have .is_empty()
		println!("Or this!");
	}
}