rust-clippy/README.md

104 lines
5.4 KiB
Markdown
Raw Normal View History

2015-04-28 19:50:04 +00:00
#rust-clippy
[![Build Status](https://travis-ci.org/Manishearth/rust-clippy.svg?branch=master)](https://travis-ci.org/Manishearth/rust-clippy)
2014-11-19 07:50:46 +00:00
A collection of lints that give helpful tips to newbies and catch oversights.
2014-11-19 19:19:03 +00:00
2015-04-28 19:50:04 +00:00
##Lints
2014-11-19 19:19:03 +00:00
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>>`
2015-04-28 19:50:04 +00:00
- `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)
2015-05-15 12:09:29 +00:00
- `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
2015-05-04 10:01:34 +00:00
- `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
2015-05-06 10:59:08 +00:00
- `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)`
2015-05-10 05:09:04 +00:00
- `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)
2015-05-18 07:02:24 +00:00
- `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
2015-05-21 12:57:20 +00:00
- `cmp_owned`: Warns on creating owned instances for comparing with others, e.g. `x == "foo".to_string()`
2015-06-02 07:23:22 +00:00
- `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() }`
2015-06-11 09:35:00 +00:00
- `zero_width_space`: Warns on encountering a unicode zero-width space
- `string_add_assign`: Warns on `x = x + ..` where `x` is a `String` and suggests using `push_str(..)` instead.
- `needless_return`: Warns on using `return expr;` when a simple `expr` would suffice.
- `let_and_return`: Warns on doing `let x = expr; x` at the end of a function.
- `option_unwrap_used`: Warns when `Option.unwrap()` is used, and suggests `.expect()`.
- `result_unwrap_used`: Warns when `Result.unwrap()` is used (silent by default).
- `modulo_one`: Warns on taking a number modulo 1, which always has a result of 0.
To use, add the following lines to your Cargo.toml:
```
2015-05-14 09:11:33 +00:00
[dependencies]
2015-05-10 10:43:02 +00:00
clippy = "*"
```
2015-04-28 19:50:04 +00:00
More to come, please [file an issue](https://github.com/Manishearth/rust-clippy/issues) if you have ideas!
2014-11-19 19:19:03 +00:00
2015-04-28 19:50:04 +00:00
##Usage
2015-06-04 03:45:56 +00:00
Compiler plugins are highly unstable and will only work with a nightly Rust for now. Since stable Rust is backwards compatible, you should be able to compile your stable programs with nightly Rust with clippy plugged in to circumvent this.
2015-06-04 03:45:56 +00:00
2015-04-28 19:50:04 +00:00
Add in your `Cargo.toml`:
2015-04-29 14:17:30 +00:00
```toml
2015-04-28 19:50:04 +00:00
[dependencies.clippy]
git = "https://github.com/Manishearth/rust-clippy"
```
2014-12-28 14:42:48 +00:00
2015-04-28 19:50:04 +00:00
Sample `main.rs`:
2015-04-29 14:17:30 +00:00
```rust
2015-04-28 19:50:04 +00:00
#![feature(plugin)]
#![plugin(clippy)]
2015-05-18 10:32:25 +00:00
2015-04-28 19:50:04 +00:00
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 }
```
2015-05-18 10:32:25 +00:00
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
2015-04-28 19:50:04 +00:00
2015-04-29 12:18:02 +00:00
*`deny` produces error instead of warnings*
2014-12-10 06:51:55 +00:00
To have cargo compile your crate with clippy without needing `#![plugin(clippy)]`
in your code, you can use:
```
cargo rustc -- -L /path/to/clippy_so -Z extra-plugins=clippy
```
2015-04-28 19:50:04 +00:00
##License
2014-12-10 06:51:55 +00:00
Licensed under [MPL](https://www.mozilla.org/MPL/2.0/). If you're having issues with the license, let me know and I'll try to change it to something more permissive.