237bb3bb2f
This change introduces the class `FutureOrTypeImpl` to represent the special types of the form `FutureOr<...>`, which were previously represented as ordinary instances of `InterfaceType`. This class mirrors the CFE's `FutureOrType` class. Adding it will facilitate further code sharing between the analyzer and the CFE, because it will allow code that's shared between the analyzer and CFE to use `is` tests to recognize `FutureOr` types. In a follow-up CL I intend to add a base class that is common to analyzer and CFE `FutureOrType` representations. Note that in https://dart-review.googlesource.com/c/sdk/+/396320, when I introduced the `NullTypeImpl` class, I took pains to find all the places in the analyzer that might call the `InterfaceTypeImpl` constructor, and updated them so that if the type they are creating is the `Null` type, they call the `NullTypeImpl` constructor instead. That was tractable for the type `Null`, since there's basically just a single `Null` type corresponding to a single declaration in `dart:core`. At first I tried doing a similar thing for `FutureOr`, but it proved to be a big pain, because `FutureOr` types get created all over the place. It was difficult to be confident that I'd updated all the necessary call sites. So instead I've put the necessary logic in the `InterfaceTypeImpl` constructor itself (by changing it into a factory constructor). This is a much lower risk approach and I'm much happier with it. In a follow-up CL I'll change the logic for `NullTypeImpl` to follow the same factory approach. Change-Id: I54c6998f991456199076faeac995e433cc88845d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/396523 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Paul Berry <paulberry@google.com>