Crystalのcli紹介 "tool implementations"
この記事は、 Crystal Advent Calendar 2017 の16日目の記事です。
crystalのcliには便利なサブコマンドやオプションがあります。コーディングを支えるものだったり、build時の細かな設定だったりします。知っていると得をする、だけど知らない人も多いかもしれない。そんなサブコマンドやオプションを紹介します。
今回は、 $ crystal tool implementations
を紹介します。
tool implementations
まずはcliのhelpを見てみましょう。
$ crystal tool --help Usage: crystal tool [tool] [switches] [program file] [--] [arguments] Tool: context show context for given location expand show macro expansion for given location format format project, directories and/or files hierarchy show type hierarchy implementations show implementations for given call in location types show type of main variables --help, -h show this help
implementations
があります。
show implementations for given call in location
カーソル上にあるメソッドが定義されている位置を出力してくれるコマンドです。implementations
のhelpも見てみましょう。
$ crystal tool implementations --help Usage: crystal tool implementations [options] [programfile] [--] [arguments] Options: -D FLAG, --define FLAG Define a compile-time flag -c LOC, --cursor LOC Cursor location with LOC as path/to/file.cr:line:column -f text|json, --format text|json Output format text (default) or json --error-trace Show full error trace -h, --help Show this message --no-color Disable colored output --prelude Use given file as prelude -s, --stats Enable statistics output -p, --progress Enable progress output -t, --time Enable execution time output
よく使うのは-c
オプションです。カーソルの位置をファイルパス:行数:列数
と指定することで、その位置にあるメソッドを対象とし、その定義が書かれている位置を表示してくれます。
例を見てみましょう。下記のファイルを用意します。
src/implementations.cr
module Implementations class MyClass getter iv def initialize(@iv : String) end def my_method "my_method" end end end c = Implementations::MyClass.new("hoge") p c.my_method p c.iv
コマンドを打ってみます。15:5
はp c.my_method
のmy_method
部分です。
$ crystal tool implementations -c src/implementations.cr:15:5 src/implementations.cr 1 implementation found /path/to/repository_root/src/implementations.cr:8:5
8:5
はdef my_method
の位置になります。
次に、macro部分に向けてコマンドを打ってみましょう。
$ crystal tool implementations -c src/implementations.cr:16:5 src/implementations.cr 1 implementation found /path/to/repository_root/src/implementations.cr:3:5 ~> macro getter: expanded macro: macro_4438952128:117:13
macroであることが出力されました。macroの位置は3:5
なので、その行列数をtool expand
に持っていきましょう。
$ crystal tool expand -c src/implementations.cr:3:5 src/implementations.cr 1 expansion found expansion 1: getter(iv) ~> def iv @iv end
macroが展開されました。
implementations
は、もちろん組み込みのメソッドに対しても有効です。下記のコードを付け足します。
p "string".gsub(/s/, "S")
gsub
に向けてコマンドを打ってみます。
$ crystal tool implementations -c src/implementations.cr:18:12 src/implementations.cr 1 implementation found /usr/local/Cellar/crystal-lang/0.23.1_3/src/string.cr:2066:3
しっかりと位置を教えてくれました。
implementations
はエディタ支援に位置します。自分はVSCodeを使っていますが、VSCodeのCrystalのプラグインでは実際にimplementations
が使われていました(implementations
の--format json
オプションを使用し、jsonをparseして情報を得ていた)。
こんなコマンドもあるんだなと知っていただければ幸いです。