概要
- 自動生成を試してみたかったので単純な(ことをしているように見える)stringer のソースを見る。
- ソース
読み解く
1-85
- 使い方やライセンスのコメント
- import
86-103
- flagの設定
- Usage という便利なものがある
105-170
- main
106-141
- 変数の初期化等
- Generator が処理を担う
142-169
- 143: パース処理
- 152-155: 自動生成部分
- 158: フォーマット処理
- Generator インスタンス内に解析した情報を保持して typeName 毎に出力出来るようにしている
181-最後
parsePackage: 213-249
- main で出てきた1つ目のGenrator の処理
- packagesライブラリを使って、Package, File インスタンスを作成する
- Fileインスタンスは、packages.Package.Syntax 毎に作成 (*ast.Filesの配列)
generate:251-297
- 254-262でtypeName型の変数名と値を取得しvaluesに保持します。(処理の詳細はFile.genDecl)
- splitIntoRuns~build: (276-295) で連番ごとのsliceに分割し、sliceの数が1,~10,11以上で生成するコードを変える。理由コメントが詳しく書いてある
slice が一つのとき
slice が~10, 11以上のとき
[format: 332-342]
- go/format パッケージ使うだけ
所感
- 解析にはgo/parserが必要でない
- genDecl部分と、ast.Fileの理解が出来れば簡単に自動生成が使えそう
- コメントがかなり丁寧に書いてある