dart-sdk/tests/language
Paul Berry 637dd76c7f Patterns parsing: fix ambiguity resolution for when and as.
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>
2023-04-28 13:22:28 +00:00
..
abstract Migrate "a" directory language tests off @compile-error. 2023-04-20 20:50:39 +00:00
accessor_conflict
argument [analyzer] NOT_ENOUGH_POSITIONAL_ARGUMENTS 2022-10-11 17:56:11 +00:00
assert [dart2wasm] Emit code for assert initializers. 2023-01-05 00:23:40 +00:00
assign Migrate "a" directory language tests off @compile-error. 2023-04-20 20:50:39 +00:00
async Issue 50672. Update flatten() 2023-02-24 22:55:17 +00:00
async_nested
async_star [tests] Fix expectations in language/async_star/async_star_await_for_test 2023-02-27 16:25:50 +00:00
await [tests] Avoid small --optimization-counter-threshold in tests 2022-10-10 21:04:18 +00:00
bool Remove uses of : as default value separator in some tests/ directories. 2022-09-07 14:49:17 +00:00
call Clean up a number of 2.19 opt outs in language tests. 2023-03-17 16:17:50 +00:00
canonicalize Spelling tests language 2022-12-19 16:30:06 +00:00
cascade Remove nbsp 2022-10-17 08:18:49 +00:00
class Remove left-over patch declarations for List constructor. 2023-04-22 00:38:28 +00:00
class_modifiers [cfe] Report error on indirect implementation of base class 2023-04-26 08:16:34 +00:00
closure [dart2wasm] Fix instantiation closure equality 2023-03-08 15:42:26 +00:00
compile_time_constant [analyzer] NOT_ENOUGH_POSITIONAL_ARGUMENTS 2022-10-11 17:56:11 +00:00
const Migrate "c" directory language tests off @compile-error. 2023-04-20 19:10:58 +00:00
const_functions opt assignable_expression_test into 2.19 2023-02-27 22:48:51 +00:00
constants_2018 [flip-patterns] Update language/constants_2018/equals_test.dart for primitive equality. 2023-03-03 23:39:37 +00:00
constructor Migrate "c" directory language tests off @compile-error. 2023-04-20 19:10:58 +00:00
control_flow_collections Simplify asyncExpectThrows and enhance Expect.throws. 2022-01-06 17:06:47 +00:00
covariant update covariant setter test to test mixin class behavior also 2023-03-17 17:38:49 +00:00
covariant_override Clean up a number of 2.19 opt outs in language tests. 2023-03-17 16:17:50 +00:00
deferred Clean up a number of 2.19 opt outs in language tests. 2023-03-17 16:17:50 +00:00
double
double_literals
dynamic [dart2wasm] Fix invocation forwarder named argument adjustment 2023-01-10 13:37:33 +00:00
enum [flip-modifiers] opt out from class modifiers some failing front end language tests 2023-03-02 20:40:20 +00:00
exception Migrate "e" and "f" directory language tests off @compile-error. 2023-04-20 20:49:17 +00:00
export Migrate "e" and "f" directory language tests off @compile-error. 2023-04-20 20:49:17 +00:00
extension_methods Fix typos 2022-06-10 15:48:54 +00:00
external_abstract_fields
factory Migrate "e" and "f" directory language tests off @compile-error. 2023-04-20 20:49:17 +00:00
field Migrate "e" and "f" directory language tests off @compile-error. 2023-04-20 20:49:17 +00:00
final Migrate "e" and "f" directory language tests off @compile-error. 2023-04-20 20:49:17 +00:00
function Spelling tests language 2022-12-19 16:30:06 +00:00
function_subtype Spelling tests standalone 2023-01-23 12:55:22 +00:00
function_type Remove uses of : as default value separator in some tests/ directories. 2022-09-07 14:49:17 +00:00
generic Migrate "g" - "i" directory language tests off @compile-error. 2023-04-19 22:09:18 +00:00
generic_methods Fix tearoff of methods from promotable variables. 2023-04-03 19:39:59 +00:00
getter Migrate "g" - "i" directory language tests off @compile-error. 2023-04-19 22:09:18 +00:00
identifier [cfe] Refactor TypeBuilders 2022-03-28 18:22:50 +00:00
identity
if
if_null Issue 48004. Report when null-aware operator is used on type. 2022-05-29 19:03:15 +00:00
implicit_creation Switch cases are no longer const contexts with patterns. 2023-02-28 01:34:26 +00:00
implicit_downcast_during Reland "Flow analysis: promote to non-nullable on initialization" 2020-10-07 13:14:55 +00:00
import Migrate "g" - "i" directory language tests off @compile-error. 2023-04-19 22:09:18 +00:00
inference Migrate "g" - "i" directory language tests off @compile-error. 2023-04-19 22:09:18 +00:00
inference_update_1 Retire experiment flags introduced in 2.18. 2022-12-15 13:18:50 +00:00
inference_update_2 Spelling pkg dev compiler 2023-01-26 09:12:41 +00:00
initializing_formal Migrate "g" - "i" directory language tests off @compile-error. 2023-04-19 22:09:18 +00:00
instance [cfe] Add UnresolvedKind for fine grained unresolved reporting 2021-08-25 09:51:54 +00:00
instantiate_to_bound master branch to main 2021-09-15 06:22:23 +00:00
interceptor
interface Remove left-over patch declarations for List constructor. 2023-04-22 00:38:28 +00:00
invalid_returns
is [tests] Avoid small --optimization-counter-threshold in tests 2022-10-10 21:04:18 +00:00
label [parser] Add beforeSynthetic to SyntheticStringToken 2021-08-30 11:56:30 +00:00
lazy Spelling tests 2023-01-19 16:24:29 +00:00
least_upper_bound Add test for upper bound with greatest closure 2021-01-21 08:51:53 +00:00
library Spelling tests language 2022-12-19 16:30:06 +00:00
list [parser] More specific error messages when recovering new/const/Map/Set/List with said literals 2021-03-25 13:27:03 +00:00
loop Migrate "l" and "m" directory language tests off @compile-error. 2023-04-20 17:51:42 +00:00
main Migrate "l" and "m" directory language tests off @compile-error. 2023-04-20 17:51:42 +00:00
malbounded Migrate "l" and "m" directory language tests off @compile-error. 2023-04-20 17:51:42 +00:00
malformed Migrate "l" and "m" directory language tests off @compile-error. 2023-04-20 17:51:42 +00:00
map [js_runtime] Use custom hashCode for GeneralConstantMap 2021-07-16 22:58:02 +00:00
metadata Remove uses of : as default value separator in some tests/ directories. 2022-09-07 14:49:17 +00:00
method Spelling pkg dev compiler 2023-01-26 09:12:41 +00:00
mixin Migrate "l" and "m" directory language tests off @compile-error. 2023-04-20 17:51:42 +00:00
mixin_constructor_forwarding Set tests that have mixin errors as 2.19. 2023-03-01 15:03:39 +00:00
mixin_declaration Migrate "l" and "m" directory language tests off @compile-error. 2023-04-20 17:51:42 +00:00
mixin_legacy Migrate "l" and "m" directory language tests off @compile-error. 2023-04-20 17:51:42 +00:00
named_arguments_anywhere Roll dart_style 2.2.2 into the repo. 2022-03-04 13:06:42 +00:00
new [cfe] Add UnresolvedKind for fine grained unresolved reporting 2021-08-25 09:51:54 +00:00
nnbd [cfe] Throw error for null in non-nullable switch in weak mode 2023-03-22 10:30:24 +00:00
no_such_method Migrate "n" through "p" directory language tests off @compile-error. 2023-04-20 17:56:18 +00:00
nonfunction_type_aliases [flip-modifiers]: Reapply "Enforce current library restrictions." 2023-03-03 09:37:38 +00:00
nosuchmethod_forwarding Remove uses of : as default value separator in some tests/ directories. 2022-09-07 14:49:17 +00:00
null [flip-modifiers] opt out from class modifiers some failing front end language tests 2023-03-02 20:40:20 +00:00
null_aware Flag additional code as unreachable due to types Null and Never. 2022-08-22 16:50:19 +00:00
number Fix web_int_literals_test.dart. 2023-04-25 21:28:39 +00:00
operator Migrate "n" through "p" directory language tests off @compile-error. 2023-04-20 17:56:18 +00:00
optimize Migrate "n" through "p" directory language tests off @compile-error. 2023-04-20 17:56:18 +00:00
override
parameter Migrate "n" through "p" directory language tests off @compile-error. 2023-04-20 17:56:18 +00:00
part [cfe] Include import paths in error for unavailable dart: libraries 2022-11-08 14:54:17 +00:00
patterns Patterns parsing: fix ambiguity resolution for when and as. 2023-04-28 13:22:28 +00:00
prefix [cfe] Add UnresolvedKind for fine grained unresolved reporting 2021-08-25 09:51:54 +00:00
private pre-emptively fix some tests for class modifiers flag flip 2023-03-01 20:11:25 +00:00
propagate
records/simple Update runtime_type_test to avoid .runtimeType on primitives. 2023-03-13 20:08:53 +00:00
redirecting Remove uses of : as default value separator in some tests/ directories. 2022-09-07 14:49:17 +00:00
reg_exp
regress Migrate "r" directory language tests off @compile-error. 2023-04-19 23:35:16 +00:00
resolution
return Migrate "r" directory language tests off @compile-error. 2023-04-19 23:35:16 +00:00
rewrite
scaling [vm] Increase supported range of TypeParameters to 16 bits. 2022-12-14 23:34:18 +00:00
script Migrate "s" directory language tests off @compile-error. 2023-04-20 17:59:44 +00:00
sealed_class [analyzer/cfe] Update abstract sealed error message. 2023-04-20 19:54:30 +00:00
set_literals [tests] Add const-big-set-literal test 2020-10-20 11:07:23 +00:00
setter Migrate "s" directory language tests off @compile-error. 2023-04-20 17:59:44 +00:00
spread_collections Front end: Fix follow-on error arising from ill-typed spread element. 2021-03-04 15:52:57 +00:00
stack_trace Reland "[vm/compiler] Move AssertAssignables out of closure bodies." 2020-11-18 22:42:31 +00:00
static Migrate "s" directory language tests off @compile-error. 2023-04-20 17:59:44 +00:00
string [parser-ish] Better errors on invalid unicode escapes 2022-03-17 13:57:45 +00:00
subtyping_static
super Migrate "s" directory language tests off @compile-error. 2023-04-20 17:59:44 +00:00
superinterface_variance Set tests that have mixin errors as 2.19. 2023-03-01 15:03:39 +00:00
switch Migrate "s" directory language tests off @compile-error. 2023-04-20 17:59:44 +00:00
symbol
sync_star Test for yield* of Iterable with throwing get:iterator 2023-04-14 22:04:28 +00:00
syntax [test] Extract test for "native" 2023-02-01 10:06:37 +00:00
this Remove uses of : as default value separator in some tests/ directories. 2022-09-07 14:49:17 +00:00
top_level Migrate "t" directory language tests off @compile-error. 2023-04-20 19:55:31 +00:00
type Migrate "t" directory language tests off @compile-error. 2023-04-20 19:55:31 +00:00
type_object Fix typos 2022-06-15 11:08:28 +00:00
type_promotion
type_variable Migrate "t" directory language tests off @compile-error. 2023-04-20 19:55:31 +00:00
typedef Migrate "t" directory language tests off @compile-error. 2023-04-20 19:55:31 +00:00
unsorted Migrate "u" and "v" directory language tests off @compile-error. 2023-04-20 22:33:22 +00:00
value_class [cfe] Add Jenkins SMI hashcode combiner 2020-09-07 12:36:13 +00:00
variable Fix year and comma in header. 2023-02-08 17:45:40 +00:00
variance [cfe,analyzer] Share experimental flags for the parser 2022-11-17 11:32:01 +00:00
vm [dart2js] Static weak references to method tearoffs 2023-03-02 20:04:19 +00:00
void Migrate "u" and "v" directory language tests off @compile-error. 2023-04-20 22:33:22 +00:00
why_not_promoted Rename some more incorrectly named tests. 2021-06-03 00:49:54 +00:00
await_type_error_test.dart
await_type_test.dart
dynamic_type_helper.dart
explicit_type_instantiation_parsing_test.dart Remove references to constructor-tearoff experiment. 2021-11-11 14:04:43 +00:00
language.status [vm/compiler] Support obfuscation of record field names 2023-04-21 15:14:58 +00:00
language_analyzer.status [tests] Cleanup test with absent deferred library 2022-11-03 17:06:42 +00:00
language_dart2js.status [dart2js, ddc] Skip flaky tests 2023-02-13 23:44:59 +00:00
language_dart2wasm.status Fix web_int_literals_test.dart. 2023-04-25 21:28:39 +00:00
language_dartdevc.status [test_runner] Cleanup unused compiler names 2023-03-07 02:09:16 +00:00
language_kernel.status Fix web_int_literals_test.dart. 2023-04-25 21:28:39 +00:00
language_precompiled.status [tests] Fix expectations in language/async_star/async_star_await_for_test 2023-02-27 16:25:50 +00:00
language_spec_parser.status Spelling tests language 2022-12-19 16:30:06 +00:00
language_vm.status [tests] Fix expectations in language/async_star/async_star_await_for_test 2023-02-27 16:25:50 +00:00
library1.dart
library2.dart
library10.dart
library11.dart
library12.dart
record_literal_problems_test.dart Add documentation for new diagnostics 2023-03-21 00:36:23 +00:00
record_literal_test.dart [tests, benchmarks] Reformat using new Dart formatter 2023-03-01 18:15:09 +00:00
record_type_empty_problems_test.dart Add documentation for new diagnostics 2023-03-21 00:36:23 +00:00
record_type_problems_test.dart Add documentation for new diagnostics 2023-03-21 00:36:23 +00:00
record_type_test.dart [tests, benchmarks] Reformat using new Dart formatter 2023-03-01 18:15:09 +00:00
static_type_helper.dart [test] Fix constructor tear off tests in language 2021-07-23 08:41:09 +00:00
static_weak_reference_error_test.dart [dart2js] Static weak references to method tearoffs 2023-03-02 20:04:19 +00:00
static_weak_reference_function_apply_test.dart [dart2js] Static weak references to method tearoffs 2023-03-02 20:04:19 +00:00
static_weak_reference_test.dart [dart2js] Static weak references to method tearoffs 2023-03-02 20:04:19 +00:00
syntax_helper.dart Additional language tests for parsing behaviors around type arguments. 2021-05-18 14:06:13 +00:00