build method

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

Generates the outputs for a given BuildStep.

Implementation

@override
Future build(BuildStep buildStep) async {
  var assetToModule = (await buildStep.fetchResource(_assetToModule))
      .putIfAbsent(_platform, () => {});
  var assetToPrimary = (await buildStep.fetchResource(_assetToPrimary))
      .putIfAbsent(_platform, () => {});
  var modules = await _transitiveModules(
      buildStep, buildStep.inputId, assetToModule, assetToPrimary, _platform);
  var connectedComponents = stronglyConnectedComponents<Module>(
      modules,
      (m) => m.directDependencies.map((d) =>
          assetToModule[d] ??
          Module(d, [d], [], _platform, false, isMissing: true)),
      equals: (a, b) => a.primarySource == b.primarySource,
      hashCode: (m) => m.primarySource.hashCode);
  Module merge(List<Module> c) =>
      _mergeComponent(c, assetToPrimary, _platform);
  bool primarySourceInPackage(Module m) =>
      m.primarySource.package == buildStep.inputId.package;
  // Ensure deterministic output by sorting the modules.
  var cleanModules = SplayTreeSet<Module>(
      (a, b) => a.primarySource.compareTo(b.primarySource))
    ..addAll(connectedComponents.map(merge).where(primarySourceInPackage));
  await buildStep.writeAsString(
      AssetId(buildStep.inputId.package,
          'lib/${metaModuleCleanExtension(_platform)}'),
      jsonEncode(MetaModule(cleanModules.toList())));
}