Open3

【Dart】コードジェネレーションの作法

heyhey1028heyhey1028

作成ステップ

  1. 3つのディレクトリを作成
    • annotations (package)
    • example (project)
    • generators (package)
  2. annotationsディレクトリにannotation定義のファイルを作成する
  3. packageのエントリーポイントとなるファイルに定義したannotationクラスをexportする
  4. generatorsディレクトリにbuild.yamlを追加
  5. generators/pubspec.yamldependenciesbuildsource_genパッケージをimport
  6. 自作のannotationsパッケージもpath指定して作成
  7. pubspec.yamlpublish_to: noneを記述
  8. generators/pubspec.yamldev_dependenciesbuild_runnerパッケージをimport
  9. build.yamlに設定を記述する
  10. generators/lib/srcmodel_visitor.dartを作成
  11. その中にSimpleElementVisitorを継承したModelVisitorクラスを作成。source_genが依存するanalyzerパッケージ内に存在している。
  12. visitConstructorElementvisitFieldElementメソッドをoverrideする。
  13. 同ディレクトリにjson_generator.dartを作成
  14. その中にGeneratorForAnnotationクラスを継承したJsonGeneratorクラスを定義。(GeneratorForAnnotationsource_genに定義されたクラス)
  15. JsonGeneratorクラスのgenerateForAnnotatedElementメソッドをoverrideする。
  16. JsonGeneratorクラスの中で生成する文字列を記載する
  17. generators/lib/generators.dartSharedPartBuilderクラスを返すメソッドを記述する
heyhey1028heyhey1028

主要な登場人物

  1. Builder
  2. Annotation
  3. Generator
  4. Visitor

自動生成の流れ

  1. build_runnerによってBuilderが実行される
  2. アノテーションがついているElementを探索する
  3. 対象Elementに対してGeneratorクラスのGenerateForAnnotatedElementが実行される
  4. element.visitChildrenを実行して、Element内の値を格納するVisitorクラスに値を格納する

言い換えると、
Builder:生成対象物の探索者
Annotation: 生成対象物を特定する目印
Generator: 生成処理プログラム
Visitor: Elementを格納する箱

BuilderがAnnotationが付いた生成対象を探して、Generatorを実行し、GeneratorはVisitorを使ってElementを取り扱いしやすいデータに加工して、コード生成に使う。

あくまでも主役は BuilderGenerator