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 package = buildStep.inputId.package;

  // 1. Quelldateien einsammeln — gleiche include-Globs, .dart-Filter und
  //    Sortierung wie scanProject im Adapter-CLI (Paritätsgarantie).
  //    Hinweis: sichtbar sind nur Assets der build_runner-Target-Sources
  //    (Standard: lib/, test/, web/, …) — Muster außerhalb davon liefern
  //    keine Dateien und würden ohne Warnung stillschweigend vom
  //    Adapter-CLI abweichen (DD §N).
  final paths = <String>{};
  for (final pattern in config.include) {
    var matched = false;
    await for (final asset in buildStep.findAssets(Glob(pattern))) {
      if (asset.package == package && asset.path.endsWith('.dart')) {
        matched = true;
        paths.add(asset.path);
      }
    }
    if (!matched) {
      log.warning('Warnung: include-Muster "$pattern" trifft keine '
          'Dateien — liegt der Pfad außerhalb der build_runner-'
          'Target-Sources (Default u. a. lib/)? Dann in der build.yaml '
          'des Zielpakets targets.\$default.sources erweitern oder das '
          'Adapter-CLI nutzen (DD §N).');
    }
  }
  final sorted = paths.toList()..sort();

  final files = <ScannedFile>[];
  for (final rel in sorted) {
    final content = await buildStep.readAsString(AssetId(package, rel));
    final result = parseString(
      content: content,
      path: rel,
      throwIfDiagnostics: false,
    );
    if (result.errors.isNotEmpty) {
      // Gleiche Meldung wie der Scanner des Adapter-CLI.
      log.warning('Warnung: $rel enthält Syntaxfehler; '
          'Analyse ist best effort.');
    }
    files.add(ScannedFile(
      relPath: rel,
      content: content,
      unit: result.unit,
      lineInfo: result.lineInfo,
    ));
  }

  // 2. Resolutions-Schritt (der Mehrwert von Weg D): konstante, aber
  //    nicht-literale Annotation-Argumente auflösen.
  final resolution = await resolveJourneyAnnotations(buildStep, files);

  // 3. Bestehende Pipeline — Merge, Sortierung und kanonische
  //    Serialisierung sind identisch zum Adapter-CLI.
  final String json;
  try {
    json = runPipeline(
      files: files,
      config: config,
      warn: log.warning,
      resolution: resolution,
      adapterName: builderAdapterName,
    );
  } on AdapterException catch (e) {
    // Gleiche Fehlersemantik wie das CLI (Meldungen einzeln, Exit ≠ 0):
    // severe-Logs markieren den Build-Schritt als fehlgeschlagen, es wird
    // kein Artefakt geschrieben.
    for (final message in e.messages) {
      log.severe(message);
    }
    return;
  }

  await buildStep.writeAsString(buildStep.allowedOutputs.single, json);
}