relationshipFields function

Iterable<VariableElement> relationshipFields(
  1. ClassElement elem
)

Implementation

Iterable<VariableElement> relationshipFields(ClassElement elem) {
  Map<String, VariableElement> map;

  map = {
    for (final field in elem.fields)
      if (field.type.element is ClassElement &&
          (field.type.element as ClassElement).supertype != null &&
          relationshipTypeChecker.isSuperOf(field.type.element!))
        field.name: field,
  };

  // if no relationships were found, we might be in presence
  // of a Freezed object, so check factory constructors
  if (map.isEmpty) {
    map = {
      for (final constructor in elem.constructors)
        if (constructor.isFactory)
          for (final param in constructor.parameters)
            if (param.type.element != null &&
                relationshipTypeChecker.isSuperOf(param.type.element!))
              param.name: param,
    };
  }

  final out = map.values.toList();

  // if parent mixes DataModel in, also include its relationships
  if (elem.supertype != null &&
      dataModelTypeChecker.isAssignableFrom(elem.supertype!.element)) {
    out.addAll(relationshipFields(elem.supertype!.element));
  }

  return out;
}