圧倒亭グランパのブログ

30年後の自分にもわかるように書くブログ

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についても出力されていることがわかります。

階層構造やインスタンス変数をサッと確認したいときに便利です。