9a83a75a10
Previously, the migration tool had a small amount of special case logic in `EdgeBuilder._dispatch` to ensure that if an `as` expression's type was annotated with `/*!*/`, that `/*!*/` wouldn't be misinterpreted as also applying to the `as` expression itself (causing a `!` operator to be inserted). This logic wasn't sufficiently general; it failed to handle `is` expressions (which can run into the same issue), and it failed to handle situations where the `is` or `as` expression was at the end of a larger expression (e.g. `y = x as T/*!*/;`). This change removes the special case logic and replaces it with a more general-purpose mechanism: when visiting any type name, if it ends in a `/*!*/`, the edge builder stores information about it in the `_nullCheckHints` field. This ensures that when visiting an expression ending in that type name, the `/*!*/` will be ignored (since `EdgeBuilder._handleNullCheckHint` skips any hints that are already stored in that field). This ensures that we properly handle both `is` and `as` expressions, as well as larger expressions that contain them. Change-Id: I2b902ef809b4cc5eb8b493fa4405c0f0c8c10a96 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/202261 Reviewed-by: Samuel Rawlins <srawlins@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Paul Berry <paulberry@google.com>