No description
Find a file
2015-06-02 09:23:22 +02:00
src fixed modules/visibility 2015-06-01 22:36:56 +02:00
tests Fixed block check, also added macro test to collapsible_if and inline_always 2015-06-01 15:09:17 +02:00
.gitignore Add eta reduction (fixes #29) 2015-05-10 11:49:08 +05:30
.travis.yml Update .travis.yml 2015-05-20 12:34:45 +05:30
Cargo.toml made in_macro distinguish intra-crate and extra-crate macros, as the latter have no working source (note: may fail in the face of compiler plugins doing whatever they like with spans), also one more run-pass test 2015-05-26 13:52:40 +02:00
README.md explained recently added lints 2015-06-02 09:23:22 +02:00

#rust-clippy Build Status

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 recommends if let instead.
  • box_vec: Warns on usage of Box<Vec<T>>
  • linkedlist: Warns on usage of LinkedList
  • str_to_string: Warns on usage of str::to_string()
  • toplevel_ref_arg: Warns when a function argument is declared ref (i.e. fn foo(ref x: u8), but not fn foo((ref x, ref y): (u8, u8)))
  • eq_op: Warns on equal operands on both sides of a comparison or bitwise combination
  • bad_bit_mask: Denies expressions of the form _ & mask == select that will only ever return true or false (because in the example select containing bits that mask doesn't have)
  • ineffective_bit_mask: Warns on expressions where a bit mask will be rendered useless by a comparison, e.g. (x | 1) > 2
  • needless_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 &str instead, respectively
  • approx_constant: Warns if the approximate of a known float constant (in std::f64::consts or std::f32::consts) is found and suggests to use the constant
  • cmp_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 bounds
  • precedence: Warns on expressions where precedence may trip up the unwary reader of the source and suggests adding parenthesis, e.g. x << 2 + y will be parsed as x << (2 + y)
  • redundant_closure: Warns on usage of eta-reducible closures like |a| foo(a) (which can be written as just foo)
  • identity_op: Warns on identity operations like x + 0 or y / 1 (which can be reduced to x and y, respectively)
  • mut_mut: Warns on &mut &mut which is either a copy'n'paste error, or shows a fundamental misunderstanding of references
  • len_zero: Warns on _.len() == 0 and 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() method
  • cmp_owned: Warns on creating owned instances for comparing with others, e.g. x == "foo".to_string()
  • redundant_closure warns on creating a closure where none is needed, e.g. |x| foo(x), where foo can be used directly
  • inline_always: Warns on #[inline(always)], because in most cases it is a bad idea
  • collapsible_if: Warns on cases where two nested if-expressions can be collapsed into one, e.g. if x { if y { foo() } } can be written as if x && y { foo() }

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 clippy lint group (#![deny(clippy)], etc)
  • only some lints (#![deny(single_match, box_vec)], etc)
  • allow/warn/deny can 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.