returnTypeSwitch<T> function

T returnTypeSwitch<T>(
  1. DartType stateType,
  2. MethodElement element, {
  3. T same()?,
  4. T stream()?,
  5. T future()?,
  6. T futureOr()?,
  7. required T orElse(),
})

Implementation

T returnTypeSwitch<T>(
  DartType stateType,
  MethodElement element, {
  T Function()? same,
  T Function()? stream,
  T Function()? future,
  T Function()? futureOr,
  required T Function() orElse,
}) {
  final returnType = element.returnType;
  if (TypeChecker.fromStatic(stateType).isExactlyType(returnType)) {
    return (same ?? orElse)();
  }

  if (TypeChecker.fromRuntime(Stream).isExactlyType(returnType)) {
    return (stream ?? orElse)();
  }

  if (returnType.isDartAsyncFuture) {
    return (future ?? orElse)();
  }

  if (returnType.isDartAsyncFutureOr) {
    return (futureOr ?? orElse)();
  }

  if (element.isAsynchronous) {
    if (element.isGenerator) {
      return (stream ?? orElse)();
    }
    return (futureOr ?? orElse)();
  }
  return (same ?? orElse)();
}