build method
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);
}