buildTemplateData method

Future<FileTemplateData?> buildTemplateData(
  1. String sourcePath,
  2. String packageName,
  3. Iterable<ClassElem> classElements,
  4. Iterable<EnumElem> enumElements,
  5. BroaderImports broaderImports,
)

Implementation

Future<FileTemplateData?> buildTemplateData(
    String sourcePath,
    String packageName,
    Iterable<ClassElem> classElements,
    Iterable<EnumElem> enumElements,
    BroaderImports broaderImports) async {
  final context = ValidationContext();
  // Collect all resource info and element pairs (class or enum)
  final (resourceInfosWithElements, nestedResourceInfos) =
      collectResourceInfos(classElements, context, enumElements);
  context.throwIfErrors();

  final fileModel = MapperModelBuilder.buildMapperModels(
      context, packageName, sourcePath, resourceInfosWithElements);
  final nestedMappers = MapperModelBuilder.buildExternalMapperModels(
      context, nestedResourceInfos);

  final toplevelMappers = fileModel.mappers.toSet();
  final mappersSortedByDependcy =
      topologicalSort({...toplevelMappers, ...nestedMappers}.toList());
  final resolvedMappers = <MapperRef, ResolvedMapperModel>{};
  final toplevelResolvedMappers = <MapperRef, ResolvedMapperModel>{};
  final resolveContext = context.withContext('resolve');
  // Resolve all mappers, but only keep the toplevel ones for output
  // The nested ones are needed internally to build up the correct dependencies
  // like instantiations of child mappers.
  for (var m in mappersSortedByDependcy) {
    final resolved =
        m.resolve(resolveContext.withContext(m.id.id), resolvedMappers);
    resolvedMappers[resolved.id] = resolved;
    if (toplevelMappers.contains(m)) {
      toplevelResolvedMappers[resolved.id] = resolved;
    }
  }

  final templateContext = context.withContext('template');
  final templateDatas = toplevelResolvedMappers.values
      .map((r) => r.toTemplateData(templateContext.withContext(r.id.id),
          fileModel.mapperFileImportUri))
      .toList();

  // Use the file template approach which handles imports properly
  final result = resourceInfosWithElements.isEmpty
      ? null
      : TemplateDataBuilder.buildFileTemplate(
          context.withContext(fileModel.originalSourcePath),
          fileModel.originalSourcePath,
          templateDatas,
          broaderImports,
          fileModel.importAliasByImportUri,
          fileModel.mapperFileImportUri);

  if (context.hasWarnings) {
    for (final warning in context.warnings) {
      _log.warning(warning);
    }
  }
  context.throwIfErrors();
  return result;
}