buildTemplateData method
Future<FileTemplateData?>
buildTemplateData(
- String sourcePath,
- String packageName,
- Iterable<ClassElem> classElements,
- Iterable<EnumElem> enumElements,
- 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;
}