collectResourceInfos method

(List<(MappableClassInfo<BaseMappingAnnotationInfo>, Elem?)>, List<(MappableClassInfo<BaseMappingAnnotationInfo>, Elem?)>) collectResourceInfos(
  1. Iterable<ClassElem> classElements,
  2. ValidationContext context,
  3. Iterable<EnumElem> enumElements, {
  4. Set<Elem>? visited,
  5. bool toplevel = true,
})

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);
}