generate method

  1. @override
Future<void> generate(
  1. List<IModuleCodeContributor> modules,
  2. Logger logger,
  3. Map<String, dynamic> coreVars,
  4. String generateTo,
)
override

Generates files based on provided modules and context.

Implementation

@override
Future<void> generate(
  List<IModuleCodeContributor> modules,
  Logger logger,
  Map<String, dynamic> coreVars,
  String generateTo,
) async {
  final disabledModules = <IModuleCodeContributor>{};

  for (final module in modules) {
    for (final brick in module.brickContributions) {
      if (disabledModules.contains(module)) continue;

      final generator = await MasonGenerator.fromBundle(brick.bundle);

      final target = DirectoryGeneratorTarget(Directory(generateTo));

      final vars = coreVars..addAll(brick.vars ?? {});
      try {
        await generator.hooks.preGen(
          vars: vars,
          onVarsChanged: vars.addAll,
          logger: logger,
        );

        final generateProgress = logger.progress(
          'Generating from ${brick.name}',
        );

        final files = await generator.generate(
          target,
          vars: vars,
          fileConflictResolution: mapMergeStrategy(brick.mergeStrategy),
          logger: logger,
        );

        generateProgress.complete('Generated ${files.length} file(s)');

        await generator.hooks.postGen(vars: vars, logger: logger);
      } on Exception catch (e) {
        final isStrict = coreVars['strict_mode'] == true;

        if (isStrict) {
          logger.err(
            '❌  Error in module ${module.moduleDescriptor.name}',
          );

          rethrow;
        } else {
          logger.detail(
            'Error during pre-generation for module '
            "'${module.moduleDescriptor.name}': $e",
          );

          disabledModules
            ..add(module)
            ..addAll(
              moduleResolver.dependentsOf(module, modules),
            );
        }
      }
    }
  }

  if (disabledModules.isNotEmpty) {
    final excludedNames =
        disabledModules.map((m) => m.moduleDescriptor.name).join(', ');

    logger
      ..info('⚠️ ⚠️ ⚠️  Generation warnings  ⚠️ ⚠️ ⚠️')
      ..info(
        ' Errors occurred during generation.\n'
        ' Excluding the following modules (and their dependents):\n'
        ' $excludedNames',
      )
      ..info('⚠️ ⚠️ ⚠️  End of warnings  ⚠️ ⚠️ ⚠️');

    modules.removeWhere(disabledModules.contains);
  }
}