build method
Generates the outputs for a given BuildStep
.
Implementation
@override
Future build(BuildStep buildStep) async {
final progressCollector =
options.config["collect_progress"] ? ProgressCollector() : null;
final stylesCollector = StylesCollector(logger);
final xmlAnalyzer = XmlAnalyzer(logger, progressCollector,
options.config["ignore_nodes"] ?? [], stylesCollector);
PathMatcher excluder = PathMatcher(options.config["ignore_input"]);
await for (final input in buildStep.findAssets(_allFilesInAssets)) {
if (excluder.match(input.path)) {
logger
.warning("XML file '${input.path}' skipped due exclusion option.");
progressCollector?.addIgnoredFile(input.path);
continue;
}
progressCollector?.addProcessedFile(input.path);
final xmlStr = await buildStep.readAsString(input);
xmlAnalyzer.process(xmlStr, input.path);
}
final widgets = xmlAnalyzer.widgets;
final classCollector = await _resolveClasses(buildStep, widgets);
addStyleRelatedAttributes(widgets, classCollector, stylesCollector);
final output = _outputFile(buildStep);
final codeGen =
CodeGenerator(widgets, classCollector, progressCollector, logger);
//this might throw exception preventing console info if success
final srcTxt = codeGen.generate();
//this should be printed only on success
logger.warning("Generated $outputFileName");
logger.warning("Don't forget to import this file and call"
" registerWidgetBuilders() function.");
logger.warning("Every time you add new types of nodes to xml files with"
" layout rerun builder.");
return buildStep.writeAsString(output, srcTxt);
}