rust-clippy/CONTRIBUTING.md

84 lines
3.8 KiB
Markdown
Raw Normal View History

2015-08-11 13:03:56 +00:00
# Contributing to rust-clippy
Hello fellow Rustacean! Great to see your interest in compiler internals and lints!
## Getting started
All issues on Clippy are mentored, if you want help with a bug just ask @Manishearth or @llogiq.
Some issues are easier than others. The [E-easy](https://github.com/Manishearth/rust-clippy/labels/E-easy)
label can be used to find the easy issues. If you want to work on an issue, please leave a comment
so that we can assign it to you!
Issues marked [T-AST](https://github.com/Manishearth/rust-clippy/labels/T-AST) involve simple
matching of the syntax tree structure, and are generally easier than
[T-middle](https://github.com/Manishearth/rust-clippy/labels/T-middle) issues, which involve types
and resolved paths.
Issues marked [E-medium](https://github.com/Manishearth/rust-clippy/labels/E-medium) are generally
pretty easy too, though it's recommended you work on an E-easy issue first.
[Llogiq's blog post on lints](https://llogiq.github.io/2015/06/04/workflows.html) is a nice primer
to lint-writing, though it does get into advanced stuff. Most lints consist of an implementation of
`LintPass` with one or more of its default methods overridden. See the existing lints for examples
of this.
T-AST issues will generally need you to match against a predefined syntax structure. To figure out
how this syntax structure is encoded in the AST, it is recommended to run `rustc -Z ast-json` on an
example of the structure and compare with the
[nodes in the AST docs](http://manishearth.github.io/rust-internals-docs/syntax/ast/). Usually
the lint will end up to be a nested series of matches and ifs,
2015-12-21 23:51:15 +00:00
[like so](https://github.com/Manishearth/rust-clippy/blob/de5ccdfab68a5e37689f3c950ed1532ba9d652a0/src/misc.rs#L34).
2015-08-11 13:03:56 +00:00
T-middle issues can be more involved and require verifying types. The
2016-03-27 20:30:35 +00:00
[`ty`](http://manishearth.github.io/rust-internals-docs/rustc/ty) module contains a
2015-08-11 13:03:56 +00:00
lot of methods that are useful, though one of the most useful would be `expr_ty` (gives the type of
an AST expression). `match_def_path()` in Clippy's `utils` module can also be useful.
2017-03-14 15:25:40 +00:00
Compiling clippy can take almost a minute or more depending on your machine.
You can set the environment flag `CARGO_INCREMENTAL=1` to cut down that time to
almost a third on average, depending on the influence your change has.
Clippy uses its own version of UI tests. Run `cargo test examples` to run only the ui tests.
This will update all the `*.stderr` files in `clippy_tests/examples`. You need to check
the stderr files whether they look as you expected them and commit them together with your
changes.
When you want to test a new lint, just create a new file in `clippy_tests/examples` and
rerun `cargo test examples`.
You can check just one example by running `cargo run --example example_name` inside the
`clippy_tests` directory.
2015-12-14 21:23:33 +00:00
Also please document your lint with a doc comment akin to the following:
```rust
/// **What it does:** Checks for ... (describe what the lint matches).
2015-12-14 21:23:33 +00:00
///
/// **Why is this bad?** Supply the reason for linting the code.
2015-12-14 21:23:33 +00:00
///
/// **Known problems:** None. (Or describe where it could go wrong.)
2015-12-14 21:23:33 +00:00
///
/// **Example:**
/// ```rust
/// Insert a short example if you have one.
/// ```
2015-12-14 21:23:33 +00:00
```
2015-12-21 19:47:19 +00:00
Our `util/update_wiki.py` script can then add your lint docs to the wiki.
2015-12-14 21:23:33 +00:00
2015-08-11 13:03:56 +00:00
## Contributions
Clippy welcomes contributions from everyone.
Contributions to Clippy should be made in the form of GitHub pull requests. Each pull request will
be reviewed by a core contributor (someone with permission to land patches) and either landed in the
main tree or given feedback for changes that would be required.
2015-08-11 22:02:20 +00:00
All code in this repository is under the [Mozilla Public License, 2.0](https://www.mozilla.org/MPL/2.0/)
2015-08-11 13:03:56 +00:00
## Conduct
We follow the [Rust Code of Conduct](http://www.rust-lang.org/conduct.html).
2015-08-11 13:05:05 +00:00
<!-- adapted from https://github.com/servo/servo/blob/master/CONTRIBUTING.md -->