Crystalのcli紹介 "tool hierarchy"
この記事は、 Crystal Advent Calendar 2017 の14日目の記事です。
crystalのcliには便利なサブコマンドやオプションがあります。コーディングを支えるものだったり、build時の細かな設定だったりします。知っていると得をする、だけど知らない人も多いかもしれない。そんなサブコマンドやオプションを紹介します。
今回は、 $ crystal tool hierarchy
を紹介します。
tool hierarchy
まずは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
hierarchy
があります。
show type hierarchy
型の階層構造を出力してくれるコマンドです。hierarchy
のhelpも見てみましょう。
$ crystal tool hierarchy --help Usage: crystal tool hierarchy [options] [programfile] [--] [arguments] Options: -D FLAG, --define FLAG Define a compile-time flag -e NAME Filter types by NAME regex -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
よく使うのは-e
オプションです。何も指定しない場合、crystalの型の全階層が出力されてしまいますが、-e NAME
を指定することで出力を絞り込むことができます。
例を見てみましょう。下記のファイルを用意します。
src/hierarchy.cr
module Hierarchy class A def initialize(@a1 : String, @a2 : String) end end class B def initialize(@b1 : String, @b2 : String) end end class C < B getter c1 : String = "c1" end class D < C getter d1 : String = "d1" end end
コマンドを打ってみます。
$ crystal tool hierarchy src/hierarchy.cr -e Hierarchy - class Object (4 bytes) | +- class Reference (4 bytes) | +- class Hierarchy::A (24 bytes) | @a1 : String (8 bytes) | @a2 : String (8 bytes) | +- class Hierarchy::B (24 bytes) . @b1 : String (8 bytes) . @b2 : String (8 bytes) | +- class Hierarchy::C (32 bytes) . @c1 : String (8 bytes) | +- class Hierarchy::D (40 bytes) @d1 : String (8 bytes)
-e Hierarchy
でHierarchyモジュールだけに絞り込んでいます。自作のclassについても出力されていることがわかります。
階層構造やインスタンス変数をサッと確認したいときに便利です。