ClientLifecycleComponent.fromClassElement constructor

ClientLifecycleComponent.fromClassElement(
  1. ClassElement element, {
  2. List<DartType> typeArguments = const [],
})

Implementation

factory ClientLifecycleComponent.fromClassElement(
  ClassElement element, {
  List<DartType> typeArguments = const [],
}) {
  final typeSubstitutions = buildTypeSubstitutionMap(element, typeArguments);
  final genericTypeParameterNames = [
    for (final typeParameter in element.typeParameters)
      if (typeParameter.name case final name?) name,
  ];

  Iterable<ClientLifecycleComponentMethod> methodsFromElement() sync* {
    for (final method in element.methods) {
      if (ClientLifecycleComponentMethod.fromElement(
            method,
            typeSubstitutions: typeSubstitutions,
          )
          case final componentMethod?) {
        yield componentMethod;
      }
    }
  }

  final methods = methodsFromElement().toList();

  final guards = <ClientLifecycleComponentMethod>[];
  final middlewares = <ClientLifecycleComponentMethod>[];
  final interceptors = (
    pre: <ClientLifecycleComponentMethod>[],
    post: <ClientLifecycleComponentMethod>[],
  );

  for (final method in methods) {
    final _ = switch (true) {
      _ when method.isGuard => guards.add(method),
      _ when method.isMiddleware => middlewares.add(method),
      _ when method.isInterceptorPre => interceptors.pre.add(method),
      _ when method.isInterceptorPost => interceptors.post.add(method),
      _ => null,
    };
  }

  return ClientLifecycleComponent(
    guards: guards,
    middlewares: middlewares,
    interceptors: interceptors,
    instantiatedTypeArguments: typeSubstitutions.isNotEmpty
        ? typeArguments.map(ClientType.fromType).toList()
        : const <ClientType>[],
    genericTypeParameterNames: genericTypeParameterNames,
  );
}