获取 AST

builder 中对象解析是基于 analyzer 模块实现的,对于 Element 对象未封装的元数据, 可以直接通过访问其 AST 获取。

在 LibraryElement 对象中提供了 session 属性用于访问解析库的会话 AnalysisSession 对象, 这里可以查询已解析的元素语法树。

// 初始化参数从 AST 中取
final libraryResult = library.session.getParsedLibraryByElement(library) as ParsedLibraryResult;
final declarationResult = libraryResult.getElementDeclaration(field);
if (declarationResult != null) {
  final variableDeclaration = declarationResult.node as VariableDeclaration;
  if (variableDeclaration.initializer != null) {
    builder.assignment = code.Code(variableDeclaration.initializer!.toSource());
  }
}

在 VSCode 中调试生成器

build 库通过生成 .dart_tool/build/entrypoint/build.dart 执行代码生成,调试这个 dart 文件就可以加载自己写的生成器。

在 .vscode 的 launch.json 文件中增加

{
    "name": "model_gen_example model_gen",
    "cwd": "packages/model_gen_example",
    "request": "launch",
    "program": ".dart_tool/build/entrypoint/build.dart",
    "type": "dart",
    "args": ["build", "--delete-conflicting-outputs", "--verbose"]
}