2b06ac466d
- Variable types are no longer specified in the call to the `Var` constructor; they are now specified in the call to `declare`. This paves the way for supporting variable pattern syntax, in which a single variable might appear in multiple variable patterns, and have its type specified in each pattern. The properties `isFinal` and `isLate` are also moved to `declare` for consistency. - Variables with inferred types are now specified by simply not including a type in `declare`; it's no longer necessary to specify `isImplicitlyTyped: true`. - `declare` now supports an `expectInferredType` argument to allow the inferred type of an implicitly typed variable to be tested. - The tests now check that variables are assigned a type before flow analysis requests it; previously this was not tested, and the flow analysis tests sometimes did things in the wrong order. (The analyzer and CFE have always done this in the proper order though). - The tests now support some of the crazy types that arise during type parameter promotion, e.g. they can now distinguish `(T&int)?` from `T&(int?)`. - Flow analysis tests now properly replicate the analyzer and CFE behaviors for converting the static type of an initializer expression to the corresponding inferred variable type: (a) `Null` is converted to `dynamic`, and (b) type parameter promotions are dropped. Note that this last behavior (dropping type parameter promotions) has a lot of subtleties, and I'm not convinced the CFE and analyzer do it soundly in all cases (I've already found one such soundness bug: https://github.com/dart-lang/sdk/issues/49691). In a later CL, I plan to add a more thorough set of language tests to verify that we don't have other lurking soundness issues. Change-Id: I6f2cd20db1f07b34e0ad4e7002351c8de846b125 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/255600 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Paul Berry <paulberry@google.com>