Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

rust-clippy の使い方

$
0
0

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: 他のエディタの設定方法)

おわりに

試してみたら思っていた以上に導入が簡単で、なぜ今まで導入をためらっていたのかという気持ちです…


  1. 非同期で実行するためには Vim 8.0.0027 以上が必要 


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>