mirror of
https://github.com/dart-lang/sdk
synced 2024-09-06 00:59:09 +00:00
![]() This change fixes parsing of case clauses such as: case foo when !flag: Constructions like this require some lookahead in order to parse correctly, because the token `when` is valid both as an identifier and as a part of the grammar for a case clause. Therefore, at the time `foo` is encountered, the parser must decide whether it is looking at a variable pattern (`foo when`, where `when` is the name of the variable) or an identifier pattern (`foo`, where `when` begins the case's guard clause). Previous to this fix, the algorithm for disambiguating these two choices was as follows: - If the token sequence starting at `foo` looked like a type, and the token that follows was an identifier, the parser assumed it was looking at a variable pattern with a type; otherwise it assumed it was looking at an identifier pattern. - EXCEPT that if the token that followed the supposed type was `when` or `as` (both of which are valid identifiers), then it probed further: - If the token that followed `when` or `as` was a token that could legitimately follow a pattern, then it assumed that it was looking at a variable pattern with a type. (The tokens that could legitimately follow a pattern are `,`, `:`, `||`, `&&`, `)`, `}`, `]`, `as`, `when`, `?`, `!`). - Otherwise it assumed that it was looking at an identifier pattern. This didn't fully disambiguate, because the third bullet didn't account for the fact that the tokens `as`, `when`, and `!` could _either_ legitimately follow a pattern _or_ legitimately begin an expression (or, in the case of `when`, a type), therefore constructs like the following were incorrectly parsed: - `case foo when as:` (where `as` is a local boolean variable) - `case foo when when:` (where `when` is a local boolean variable) - `case foo when !flag:` (where `flag` is a local boolean variable) - `case foo as when:` (where `when` is the name of a type) The solution is to simplify the disambiguation logic so that if if the token that follows the supposed type is `when` or `as`, then the parser assumes that it's looking at an identifier pattern, _not_ a typed variable pattern. The consequence of this is that the above four constructions are parsed correctly; however it is no longer possible for a typed variable pattern to name a variable `when` or `as`. For consistency we would like to prohibit _any_ variable pattern from naming a variable `when` or `as`, however to keep this change as small as possible (and reduce the risk involved in a possible cherry-pick) that will be postponed until a later CL. Fixes #52199. Bug: https://github.com/dart-lang/sdk/issues/52199 Change-Id: Ibab9b92f01e3e4020d7d64f1ff000a9b964a4564 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/299400 Commit-Queue: Paul Berry <paulberry@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Jens Johansen <jensj@google.com> |
||
---|---|---|
.. | ||
co19 | ||
co19_2 | ||
corelib | ||
corelib_2 | ||
dartdevc | ||
dartdevc_2 | ||
ffi | ||
ffi_2 | ||
language | ||
language_2 | ||
lib | ||
lib_2 | ||
modular | ||
standalone | ||
standalone_2 | ||
web | ||
web_2 | ||
legacy_status_dart2js.csv | ||
OWNERS | ||
README.md |
This directory contains tests of the language and core library implementations. For more information, see https://github.com/dart-lang/sdk/wiki/Testing.