build method

  1. @override
Future build(
  1. BuildStep buildStep
)

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