build method

  1. @override
Future<void> build(
  1. BuildStep buildStep
)

Generates the outputs for a given BuildStep.

Implementation

@override
Future<void> build(BuildStep buildStep) async {
  final inputId = buildStep.inputId;
  final outputId = buildStep.allowedOutputs.single;

  if (inputId.path.endsWith(".g.dart")) {
    return;
  }

  final StringBuffer output = StringBuffer();

  // log.warning("build: ${inputId.path}, outputId: ${outputId.path}");

  final ele = await buildStep.resolver.libraryFor(buildStep.inputId);
  final visitor = ClassNameVisitor(nodeName: "Div");

  await Future.wait(
    ele.topLevelElements.map((e) async {
      final ast = await buildStep.resolver.astNodeFor(e, resolve: true);
      if (ast == null) {
        return;
      }
      ast.visitChildren(visitor);
    }),
  );

  // Find all className constants
  for (var className in visitor.foundClassNames) {
    output.writeln("// [className]: $className");
  }

  /// Find the EasyDSL annotation
  final allElements = [
    ele,
    ...ele.topLevelElements,
    ...ele.libraryImports,
    ...ele.libraryExports,
    ...ele.parts,
  ];

  TypeChecker typeChecker = TypeChecker.fromRuntime(EasyDSL);

  for (final element in allElements) {
    final anno = typeChecker.firstAnnotationOf(element);
    if (anno != null) {
      output.writeln("// [element]: ${anno.type}");
    }
  }

  final out = output.toString();
  if (out.isNotEmpty) {
    await buildStep.writeAsString(outputId, out);
  }
}