6e6f89a255
Previously, if multiple switch cases shared a body, and at least one of those cases promoted a match variable using a `when` clause, the promotion would not be carried over to the merged variable seen in the shared case body. This was happening because promotions performed in the `when` clause were applied to the promotion key associated with the client's representation of the variable, whereas flow analysis was computing the state of the merged variable based on the promotion keys used internally while visiting the pattern (which don't include promotions from the `when` clause). With this change, flow analysis now computes the merged variable state based on the promotion keys associated with the client's representation of the variable components, so promotions from `when` clauses take effect. In the process, I've moved a lot of the tracking of these promotion keys from the `TypeAnalyzer` class to the `_FlowAnalysisImpl` class. This avoids the need to expose more flow analysis internals through its public API. Fixes #51399. Bug: https://github.com/dart-lang/sdk/issues/51399 Change-Id: I8f1bb6e49ceb8441bb743c63af61c119df9041f2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/283441 Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Paul Berry <paulberry@google.com>