build method

  1. @override
Future<void> build(
  1. BuildStep buildStep
)

Generates the outputs for a given BuildStep.

Implementation

@override
Future<void> build(BuildStep buildStep) async {
  _buildStep = buildStep;

  Map<AssetId, String> testFiles = {};

  //Repositories
  _dartServerRepository = DartServerRepository();
  await _dartServerRepository.initialize();
  _pathRepository = PathRepository();
  _generationRepository = GenerationRepository();

  ///Executors
  _fixerExecutor = FixerExecutor(_dartServerRepository
      .server); //TODO: Create methods and don't pass server directly
  _astElementExecutor = AstElementExecutor();
  _unitTestExecutor = UnitTestExecutor(_generationRepository);

  await for (final input in buildStep.findAssets(_testFiles)) {
    final testContent = await buildStep.readAsString(input);
    testFiles[input] = testContent;
  }
  final List<Future<Map<String, dynamic>>> saveFutures = [];

  await for (final input in buildStep.findAssets(_codeFiles)) {
    try {
      final inputLibrary =
          await buildStep.resolver.libraryFor(input, allowSyntaxErrors: true);

      for (final topLevelElement in inputLibrary.topLevelElements) {
        final checker = TypeChecker.fromRuntime(Welltested);
        final annotationElement = checker.firstAnnotationOf(
          topLevelElement,
          throwOnUnresolved: true,
        );

        if (annotationElement != null) {
          if (!(topLevelElement is ClassElement)) return;

          try {
            saveFutures.addAll(await saveTests(
                topLevelElement, input, ConstantReader(annotationElement)));
          } catch (e) {
            log.severe(
                "Error saving tests for ${topLevelElement.name} in ${input.path}");
          }
        }
      }
    } catch (e) {}
  }
  await Future.wait(saveFutures);
  _dartServerRepository.server.dispose();

  ///TODO: can save some metadata here
  return buildStep.writeAsString(_allFileOutput(buildStep), '//Placeholder');
}