4eaacc3df9
In general any async function can return X or Future<X>. Though the future implementation has to do different things depending on which case we're in. It does so by using a `<obj> is Future<T>` test. This test is very expensive if many different classes flow into `<obj>`. Though most functions do not return `Future` objects from async functions. We can determine that statically by looking if any returned expression could be a future. If not, we can bypass the `is Future<T>` test entirely. Issue https://github.com/dart-lang/sdk/issues/48226 Issue https://github.com/dart-lang/sdk/issues/48235 TEST=pkg/front_end/testcases/general/async_function_returns_future_or.dart Change-Id: If655bdbdddc214dd7b12be9905b3c788252547d0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/230662 Reviewed-by: Alexander Markov <alexmarkov@google.com> Reviewed-by: Lasse Nielsen <lrn@google.com> Commit-Queue: Martin Kustermann <kustermann@google.com>