rust-clippy
の存在自体は以前から知っていたのですが、なんとなく食わず嫌いのまま放置してしまっていたので、作業記録を兼ねこの機会に紹介しようと思います。
参考:
使用方法
Rust のインストールに rustup
を使用していることを前提に説明します。おそらくこれ以外の方法で Rust の環境を構築している人は少数派と思われますが… (先日めでたくメジャーアップデートがアナウンスされましたね)
また、rust-clippy
は nightly チャンネルを前提にしているため nightly チャンネルのツールチェインをインストールしておいてください。
$ rustup toolchain install nightly
コマンドラインから使用する
基本的な例として、まずはコマンドラインから clippy
を使ってみます。
nightly チャンネルの cargo
コマンドを用いて clippy
を次のようにインストールします。cargo-clippy
という名前で $HOME/.cargo/bin
下にバイナリが生成されるので、cargo
のサブコマンドとして Lint を走らせることが出来ます。
$ rustup run nightly cargo install clippy$ rustup run nightly cargo clippy
rustup
の機能を用いると、上のコマンドは次のように簡略化することも可能です。
$ cargo +nightly install clippy$ cargo +nightly clippy
例題として、公式リポジトリの README に記載しているサンプルコードに対して Lint を実行してみます。
今回検証に用いたソースコードは次のとおりです。
fnmain(){letx=Some(1u8);matchx{Some(y)=>println!("{:?}",y),_=>()}}
個人的には main()
のあとに空白がないのが気になる
上のコードを保存し、clippy
を実行してみます。
$ cargo +nightly clippy
Compiling hoge v0.1.0 (file:///home/vagrant/work/hoge)
warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let`, #[warn(single_match)] on by default
--> src/main.rs:3:5
|
3 | match x {
| _____^ starting here...
4 | | Some(y) => println!("{:?}", y),
5 | | _ => (),
6 | | }
| |_____^ ...ending here
|
help: try this
| if let Some(y) = x { $ crate :: io :: _print ( format_args ! ( $ ( $ arg ) * ) ) }
= help: for further information visit https://github.com/Manishearth/rust-clippy/wiki#single_match
Finished debug [unoptimized + debuginfo] target(s) in 0.30 secs
if let
を使用しろと出てきました。 println!()
マクロが展開されてしまっているのが若干気になりますが、概ね可読性の高いメッセージが出力されて良い感じです。
ビルド時に Lint する
clippy
はライブラリとしても提供されており、ビルド時に自動的に Lint が走るように設定することが出来ます。
まず、Cargo.toml
に次のように clippy
への依存を追加します。この際、clippy
という名前で feature を追加することで --features="clippy"
が指定された場合にのみ Lint を実行するように設定します。
[dependencies]clippy={version="*",optional=true}[features]default=[]
次に、crate のソースファイル(main.rs
または lib.rs
)の先頭に次の属性を追記します。
#![cfg_attr(feature="clippy",feature(plugin))]#![cfg_attr(feature="clippy",plugin(clippy))]// ...
以上で設定完了です。実行結果は以下のようになります。
$ cargo +stable build
...
$ cargo +nightly build --features clippy
Compiling hoge v0.1.0 (file:///home/vagrant/work/hoge)
warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let`, #[warn(single_match)] on by default
...
Vim で Lint を走らせる
Neomakeというプラグインが clippy
をサポートしています。名前が Neovim っぽいですが、比較的新しい Vim でも使用できます1。:Neomake! clippy
で Lint が実行されます(非同期に実行されるため、結果が表示されるまでに若干時間がかかる場合あり)。
ファイル保存時に clippy
を実行する場合は、次の設定を vimrc
に追加します。
augroup NeomakeRustConfig
autocmd!autocmdBufWritePost *.rs Neomake! clippy
augroup END
(TODO: 他のエディタの設定方法)
おわりに
試してみたら思っていた以上に導入が簡単で、なぜ今まで導入をためらっていたのかという気持ちです…
非同期で実行するためには Vim 8.0.0027 以上が必要 ↩