build method

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

Generates the outputs for a given BuildStep.

Implementation

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

  //Buffers:
  final fileBuffer = StringBuffer();
  final headerBuffer = StringBuffer();
  final importsBuffer = StringBuffer();
  final classBuffer = StringBuffer();
  final converterBuffer = StringBuffer();

  //Generate header
  HeaderGenerator.generateHeader(headerBuffer);

  importsBuffer.writeln("import 'package:firestorm/fs/fs.dart';");
  importsBuffer.writeln("import 'package:firestorm/rdb/rdb.dart';");

  final Map<AssetId, Iterable<ClassElement>> allClasses = {};
  final Map<ClassElement, AssetId> assetIDs = {};
  final Map<EnumElement, AssetId> enumAssetIds = {};

  //Read the classes from the files and store in allClasses map:
  await for (final input in buildStep.findAssets(Glob('lib/**.dart'))) { //iterates through all .dart files
    if (!await buildStep.resolver.isLibrary(input)) {
      continue;
    }
    final libraryElement = await buildStep.resolver.libraryFor(input);
    final libraryReader = LibraryReader(libraryElement);
    allClasses[input] = libraryReader.classes;

    for (final aClass in libraryReader.classes) {
      assetIDs[aClass] = input; //Map each class to its AssetId
    }

    //enums:
    for (final aClass in libraryReader.enums) {
      enumAssetIds[aClass] = input; //Map each enum to its AssetId
    }

  }

  //Perform filtering
  //1. @FirestormObject annotation
  //2. public no-arg constructor
  //3. ID field
  //4. Firestore or Realtime Database support (type checks)

  ValidClassHolder allFilesClassHolder = ValidClassHolder.empty();
  for (final pair in allClasses.entries) {
    final Iterable<ClassElement> allClasses = pair.value;
    var fileClassHolder = ClassChecker.filter(allClasses);
    allFilesClassHolder.join(fileClassHolder);
  }

  //For every valid class, generate necessary imports and its extension:
  for (final validClass in allFilesClassHolder.getAllValidClasses()) {

    //Add into the import buffer, if there are any classes in this file
    ImportGenerator.generateImports(importsBuffer, assetIDs[validClass]!);

    //Generate extensions:
    ExtensionGenerator.generateExtension(
        classBuffer,
        validClass,
        allFilesClassHolder.hasFSSupport(validClass),
        allFilesClassHolder.hasRDBSupport(validClass)
    );
  }

  //Generate imports for enums:
  for (final assetID in enumAssetIds.values) {
    ImportGenerator.generateImports(importsBuffer, assetID);
  }

  //Generate the converter functions
  RegistryGenerator.generateConverterFunctions(converterBuffer, allFilesClassHolder);

  //Add everything into the file buffer
  fileBuffer.writeln(headerBuffer.toString());
  fileBuffer.writeln(importsBuffer.toString());
  fileBuffer.writeln(classBuffer.toString());
  fileBuffer.writeln(converterBuffer.toString());

  final formattedOutput = fileBuffer.toString();

  final outputId = AssetId(buildStep.inputId.package, 'lib/generated/firestorm_models.dart');
  await buildStep.writeAsString(outputId, formattedOutput);
}