| # Basics for hacking on Clippy |
| |
| This document explains the basics for hacking on Clippy. Besides others, this |
| includes how to build and test Clippy. For a more in depth description on the |
| codebase take a look at [Adding Lints] or [Common Tools]. |
| |
| [Adding Lints]: adding_lints.md |
| [Common Tools]: common_tools_writing_lints.md |
| |
| - [Basics for hacking on Clippy](#basics-for-hacking-on-clippy) |
| - [Get the Code](#get-the-code) |
| - [Building and Testing](#building-and-testing) |
| - [`cargo dev`](#cargo-dev) |
| - [lintcheck](#lintcheck) |
| - [PR](#pr) |
| - [Common Abbreviations](#common-abbreviations) |
| - [Install from source](#install-from-source) |
| |
| ## Get the Code |
| |
| First, make sure you have checked out the latest version of Clippy. If this is |
| your first time working on Clippy, create a fork of the repository and clone it |
| afterwards with the following command: |
| |
| ```bash |
| git clone git@github.com:<your-username>/rust-clippy |
| ``` |
| |
| If you've already cloned Clippy in the past, update it to the latest version: |
| |
| ```bash |
| # If the upstream remote has not been added yet |
| git remote add upstream https://github.com/rust-lang/rust-clippy |
| # upstream has to be the remote of the rust-lang/rust-clippy repo |
| git fetch upstream |
| # make sure that you are on the master branch |
| git checkout master |
| # rebase your master branch on the upstream master |
| git rebase upstream/master |
| # push to the master branch of your fork |
| git push |
| ``` |
| |
| ## Building and Testing |
| |
| You can build and test Clippy like every other Rust project: |
| |
| ```bash |
| cargo build # builds Clippy |
| cargo test # tests Clippy |
| ``` |
| |
| Since Clippy's test suite is pretty big, there are some commands that only run a |
| subset of Clippy's tests: |
| |
| ```bash |
| # only run UI tests |
| cargo uitest |
| # only run UI tests starting with `test_` |
| TESTNAME="test_" cargo uitest |
| # only run dogfood tests |
| cargo dev dogfood |
| ``` |
| |
| If the output of a [UI test] differs from the expected output, you can update |
| the reference file with: |
| |
| ```bash |
| cargo bless |
| ``` |
| |
| For example, this is necessary if you fix a typo in an error message of a lint, |
| or if you modify a test file to add a test case. |
| |
| > _Note:_ This command may update more files than you intended. In that case |
| > only commit the files you wanted to update. |
| |
| [UI test]: https://rustc-dev-guide.rust-lang.org/tests/adding.html#ui-test-walkthrough |
| |
| ## `cargo dev` |
| |
| Clippy has some dev tools to make working on Clippy more convenient. These tools |
| can be accessed through the `cargo dev` command. Available tools are listed |
| below. To get more information about these commands, just call them with |
| `--help`. |
| |
| ```bash |
| # formats the whole Clippy codebase and all tests |
| cargo dev fmt |
| # register or update lint names/groups/... |
| cargo dev update_lints |
| # create a new lint and register it |
| cargo dev new_lint |
| # deprecate a lint and attempt to remove code relating to it |
| cargo dev deprecate |
| # automatically formatting all code before each commit |
| cargo dev setup git-hook |
| # (experimental) Setup Clippy to work with RustRover |
| cargo dev setup intellij |
| # runs the `dogfood` tests |
| cargo dev dogfood |
| ``` |
| |
| More about [intellij] command usage and reasons. |
| |
| [intellij]: https://github.com/rust-lang/rust-clippy/blob/master/CONTRIBUTING.md#rustrover |
| |
| ## lintcheck |
| |
| `cargo lintcheck` will build and run Clippy on a fixed set of crates and |
| generate a log of the results. You can `git diff` the updated log against its |
| previous version and see what impact your lint made on a small set of crates. |
| If you add a new lint, please audit the resulting warnings and make sure there |
| are no false positives and that the suggestions are valid. |
| |
| Refer to the tools [README] for more details. |
| |
| [README]: https://github.com/rust-lang/rust-clippy/blob/master/lintcheck/README.md |
| |
| ## PR |
| |
| We follow a rustc no merge-commit policy. See |
| <https://rustc-dev-guide.rust-lang.org/contributing.html#opening-a-pr>. |
| |
| ## Common Abbreviations |
| |
| | Abbreviation | Meaning | |
| |--------------|----------------------------------------| |
| | UB | Undefined Behavior | |
| | FP | False Positive | |
| | FN | False Negative | |
| | ICE | Internal Compiler Error | |
| | AST | Abstract Syntax Tree | |
| | MIR | Mid-Level Intermediate Representation | |
| | HIR | High-Level Intermediate Representation | |
| | TCX | Type context | |
| |
| This is a concise list of abbreviations that can come up during Clippy |
| development. An extensive general list can be found in the [rustc-dev-guide |
| glossary][glossary]. Always feel free to ask if an abbreviation or meaning is |
| unclear to you. |
| |
| ## Install from source |
| |
| If you are hacking on Clippy and want to install it from source, do the |
| following: |
| |
| From the Clippy project root, run the following command to build the Clippy |
| binaries and copy them into the toolchain directory. This will create a new |
| toolchain called `clippy` by default, see `cargo dev setup toolchain --help` |
| for other options. |
| |
| ```terminal |
| cargo dev setup toolchain |
| ``` |
| |
| Now you may run `cargo +clippy clippy` in any project using the new toolchain. |
| |
| ```terminal |
| cd my-project |
| cargo +clippy clippy |
| ``` |
| |
| ...or `clippy-driver` |
| |
| ```terminal |
| clippy-driver +clippy <filename> |
| ``` |
| |
| If you no longer need the toolchain it can be uninstalled using `rustup`: |
| |
| ```terminal |
| rustup toolchain uninstall clippy |
| ``` |
| |
| > **DO NOT** install using `cargo install --path . --force` since this will |
| > overwrite rustup |
| > [proxies](https://rust-lang.github.io/rustup/concepts/proxies.html). That is, |
| > `~/.cargo/bin/cargo-clippy` and `~/.cargo/bin/clippy-driver` should be hard or |
| > soft links to `~/.cargo/bin/rustup`. You can repair these by running `rustup |
| > update`. |
| |
| [glossary]: https://rustc-dev-guide.rust-lang.org/appendix/glossary.html |