b51ca1c3db2c4d2195f325c28bdff83c771705ca
A collection of lints that give helpful tips to newbies and catch oversights.
##Lints Lints included in this crate:
single_match: Warns when a match statement with a single nontrivial arm (i.e, where the other arm is_ => {}) is used, and recommendsif letinstead.box_vec: Warns on usage ofBox<Vec<T>>linkedlist: Warns on usage ofLinkedListstr_to_string: Warns on usage ofstr::to_string()toplevel_ref_arg: Warns when a function argument is declaredref(i.e.fn foo(ref x: u8), but notfn foo((ref x, ref y): (u8, u8)))eq_op: Warns on equal operands on both sides of a comparison or bitwise combinationbad_bit_mask: Denies expressions of the form_ & mask == selectthat will only ever returntrueorfalse(because in the exampleselectcontaining bits thatmaskdoesn't have)ineffective_bit_mask: Warns on expressions where a bit mask will be rendered useless by a comparison, e.g.(x | 1) > 2needless_bool: Warns on if-statements with plain booleans in the then- and else-clause, e.g.if p { true } else { false }ptr_arg: Warns on fn arguments of the type&Vec<...>or&String, suggesting to use&[...]or&strinstead, respectivelyapprox_constant: Warns if the approximate of a known float constant (instd::f64::constsorstd::f32::consts) is found and suggests to use the constantcmp_nan: Denies comparisons to NAN (which will always return false, which is probably not intended)float_cmp: Warns on==or!=comparisons of floaty typed values. As floating-point operations usually involve rounding errors, it is always better to check for approximate equality within some small boundsprecedence: Warns on expressions where precedence may trip up the unwary reader of the source and suggests adding parenthesis, e.g.x << 2 + ywill be parsed asx << (2 + y)redundant_closure: Warns on usage of eta-reducible closures like|a| foo(a)(which can be written as justfoo)identity_op: Warns on identity operations likex + 0ory / 1(which can be reduced toxandy, respectively)mut_mut: Warns on&mut &mutwhich is either a copy'n'paste error, or shows a fundamental misunderstanding of referenceslen_zero: Warns on_.len() == 0and suggests using_.is_empty()(or similar comparisons with>or!=)len_without_is_empty: Warns on traits or impls that have a.len()but no.is_empty()methodcmp_owned: Warns on creating owned instances for comparing with others, e.g.x == "foo".to_string()
To use, add the following lines to your Cargo.toml:
[dependencies]
clippy = "*"
More to come, please file an issue if you have ideas!
##Usage
Add in your Cargo.toml:
[dependencies.clippy]
git = "https://github.com/Manishearth/rust-clippy"
Sample main.rs:
#![feature(plugin)]
#![plugin(clippy)]
fn main(){
let x = Some(1u8);
match x {
Some(y) => println!("{:?}", y),
_ => ()
}
}
Produce this warning:
src/main.rs:8:5: 11:6 warning: You seem to be trying to use match for destructuring a single type. Did you mean to use `if let`?, #[warn(single_match)] on by default
src/main.rs:8 match x {
src/main.rs:9 Some(y) => println!("{:?}", y),
src/main.rs:10 _ => ()
src/main.rs:11 }
src/main.rs:8:5: 11:6 note: Try if let Some(y) = x { ... }
src/main.rs:8 match x {
src/main.rs:9 Some(y) => println!("{:?}", y),
src/main.rs:10 _ => ()
src/main.rs:11 }
You can add options to allow/warn/deny:
- the whole set using the
clippylint group (#![deny(clippy)], etc) - only some lints (
#![deny(single_match, box_vec)], etc) allow/warn/denycan be limited to a single function or module using#[allow(...)], etc
deny produces error instead of warnings
##License Licensed under MPL. If you're having issues with the license, let me know and I'll try to change it to something more permissive.
Description
Languages
Rust
96%
Shell
0.9%
JavaScript
0.7%
C
0.4%
Python
0.4%
Other
1.5%