collectResourceInfos method
(List<(MappableClassInfo<BaseMappingAnnotationInfo> , Elem?)> , List<(MappableClassInfo<BaseMappingAnnotationInfo> , Elem?)> )
collectResourceInfos(})
Implementation
(
List<(MappableClassInfo, Elem?)> toplevel,
List<(MappableClassInfo, Elem?)> nested
) collectResourceInfos(Iterable<ClassElem> classElements,
ValidationContext context, Iterable<EnumElem> enumElements,
{Set<Elem>? visited, bool toplevel = true}) {
visited ??= <Elem>{};
// Collect all resource info and element pairs (class or enum)
final resourceInfosWithElements = <(MappableClassInfo, Elem?)>[];
final allFieldTypes = <DartType>{};
for (final classElement in classElements) {
visited.add(classElement);
final MappableClassInfo? resourceInfo =
processClass(context, classElement);
if (resourceInfo != null) {
allFieldTypes.addAll(resourceInfo.properties
.map((p) => p.propertyInfo?.annotation.itemType)
.nonNulls);
resourceInfosWithElements.add((resourceInfo, classElement));
}
}
// Process enums
for (final enumElement in enumElements) {
visited.add(enumElement);
final enumInfo = EnumProcessor.processEnum(
context.withContext(enumElement.name),
enumElement,
);
if (enumInfo != null) {
allFieldTypes.addAll(enumInfo.properties
.map((p) => p.propertyInfo?.annotation.itemType)
.nonNulls);
resourceInfosWithElements.add((enumInfo, enumElement));
}
}
final classesToProcess = allFieldTypes
.where((t) => t.isElementClass)
.map((t) => t.element)
.whereType<ClassElem>()
.where((elem) => !visited!.contains(elem))
.toSet();
final enumsToProcess = allFieldTypes
.where((t) => t.isElementEnum)
.map((t) => t.element)
.whereType<EnumElem>()
.where((elem) => !visited!.contains(elem))
.toSet();
final toplevelList =
toplevel ? resourceInfosWithElements : <(MappableClassInfo, Elem?)>[];
final nestedList =
toplevel ? <(MappableClassInfo, Elem?)>[] : resourceInfosWithElements;
if (classesToProcess.isNotEmpty || enumsToProcess.isNotEmpty) {
final (extraToplevel, extraNested) = collectResourceInfos(
classesToProcess, context, enumsToProcess,
visited: visited, toplevel: false);
toplevelList.addAll(extraToplevel);
nestedList.addAll(extraNested);
}
return (toplevelList, nestedList);
}