[wildcard-variables] Basic language tests for non-binding locals.
Making language tests in small batches. These are very basic ones to test that you can have multiple local declarations named `_` in the same namespace without a collision error.
Bug: https://github.com/dart-lang/sdk/issues/55652
Change-Id: I4d00e9072ba745b363d68db72505c599953c41ad
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/366022
Reviewed-by: Lasse Nielsen <lrn@google.com>
Commit-Queue: Kallen Tu <kallentu@google.com>
Reviewed-by: Erik Ernst <eernst@google.com>
diff --git a/tests/language/wildcard_variables/multiple/local_declaration_catch_rethrow_test.dart b/tests/language/wildcard_variables/multiple/local_declaration_catch_rethrow_test.dart
new file mode 100644
index 0000000..777cddc
--- /dev/null
+++ b/tests/language/wildcard_variables/multiple/local_declaration_catch_rethrow_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests multiple catch clause wildcard variable declarations with rethrow.
+
+// SharedOptions=--enable-experiment=wildcard-variables
+
+import 'package:expect/expect.dart';
+
+void main() {
+ var error = StateError("State bad!");
+ var stack = StackTrace.fromString("My stack trace");
+ var caught = false;
+
+ // Multiple wildcard catch clause variables.
+ try {
+ try {
+ Error.throwWithStackTrace(error, stack);
+ } on StateError catch (_, _) {
+ caught = true;
+ rethrow;
+ }
+ } on StateError catch (e, s) {
+ Expect.isTrue(caught);
+ Expect.identical(error, e);
+ Expect.equals(stack.toString(), s.toString());
+ Expect.equals(stack.toString(), e.stackTrace.toString());
+ }
+
+ // Single wildcard catch clause variable.
+ try {
+ try {
+ Error.throwWithStackTrace(error, stack);
+ } on StateError catch (_) {
+ caught = true;
+ rethrow;
+ }
+ } on StateError catch (e, s) {
+ Expect.isTrue(caught);
+ Expect.identical(error, e);
+ Expect.equals(stack.toString(), s.toString());
+ Expect.equals(stack.toString(), e.stackTrace.toString());
+ }
+
+ try {
+ try {
+ Error.throwWithStackTrace(error, stack);
+ } on StateError catch (_, s) {
+ Expect.equals(stack.toString(), s.toString());
+ caught = true;
+ rethrow;
+ }
+ } on StateError catch (e, s) {
+ Expect.isTrue(caught);
+ Expect.identical(error, e);
+ Expect.equals(stack.toString(), s.toString());
+ Expect.equals(stack.toString(), e.stackTrace.toString());
+ }
+}
diff --git a/tests/language/wildcard_variables/multiple/local_declaration_catch_test.dart b/tests/language/wildcard_variables/multiple/local_declaration_catch_test.dart
new file mode 100644
index 0000000..4a4d2f80
--- /dev/null
+++ b/tests/language/wildcard_variables/multiple/local_declaration_catch_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests multiple catch clause wildcard variable declarations.
+
+// SharedOptions=--enable-experiment=wildcard-variables
+
+void main() {
+ try {
+ throw '!';
+ } on Exception catch (_, _) {
+ rethrow; // Should not hit this catch.
+ } catch (_, _) {
+ print('catch');
+ }
+}
diff --git a/tests/language/wildcard_variables/multiple/local_declaration_for_loop_test.dart b/tests/language/wildcard_variables/multiple/local_declaration_for_loop_test.dart
new file mode 100644
index 0000000..0150b44
--- /dev/null
+++ b/tests/language/wildcard_variables/multiple/local_declaration_for_loop_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests for-loop wildcard variable declarations.
+
+// SharedOptions=--enable-experiment=wildcard-variables
+
+void main() async {
+ // Multiple for-loop wildcard declarations.
+ for (int _ = 0, _ = 2;;) {
+ break;
+ }
+
+ var list = [];
+ for (var _ in list) {}
+
+ var stream = Stream.empty();
+ await for (var _ in stream) {}
+}
diff --git a/tests/language/wildcard_variables/multiple/local_declaration_function_parameter_test.dart b/tests/language/wildcard_variables/multiple/local_declaration_function_parameter_test.dart
new file mode 100644
index 0000000..9536c08
--- /dev/null
+++ b/tests/language/wildcard_variables/multiple/local_declaration_function_parameter_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests multiple wildcard function parameters.
+
+// SharedOptions=--enable-experiment=wildcard-variables
+
+import 'package:expect/expect.dart';
+
+class Constructor {
+ final _;
+
+ // TODO(kallentu): Update this once the behaviour of super._ is finalized.
+ // https://github.com/dart-lang/language/issues/3792
+ Constructor.multiple(_, this._, void _()) {}
+ Constructor.parameter(_, _, this._) {}
+ Constructor.functionType(this._, void _(), void _()) {}
+}
+
+bool topLevelFunction(int _, int _) => true;
+bool topLevelFunction2(_, _) => true;
+bool topLevelFunction_functionType(void _(), void _()) => true;
+
+class InstanceMethod {
+ bool instanceMethod(int _, int _) => true;
+ bool instanceMethod2(_, _) => true;
+ bool instanceMethod_functionType(void _(), void _()) => true;
+
+ // User-defined operators
+ int operator +(int _) => 42;
+ void operator []=(int _, _) {}
+
+ // Inherited `Object` methods
+ dynamic noSuchMethod(Invocation _) => true;
+ bool operator ==(Object _) => true;
+}
+
+abstract class AbstractMethod {
+ bool abstractMethod(int _, int _);
+ bool abstractMethod2(_, _);
+ bool abstractMethod_functionType(void _(), void _());
+}
+
+class AbstractMethodSubclass extends AbstractMethod {
+ bool abstractMethod(int _, int _) => true;
+ bool abstractMethod2(_, _) => true;
+ bool abstractMethod_functionType(void _(), void _()) => true;
+}
+
+class Setter {
+ int _x;
+ Setter(this._x);
+
+ int get x => _x;
+ set x(int _) => _x = 2;
+}
+
+class StaticMethod {
+ static int staticMethod(int _, int _) => 2;
+ static int staticMethod2(_, _) => 2;
+ static int staticMethod_functionType(void _(), void _()) => 2;
+ static int staticMethod_functionTypeNested(
+ void _(_, _), void _(int _, int _)) =>
+ 2;
+ static int staticMethod_functionTypeNew(
+ void Function(int _, int _) _, void Function(int _, int _) _) =>
+ 2;
+ static int staticMethod_functionTypeGeneric(
+ void Function<_, _>(int _, int _) _, void _<_>(_, _)) =>
+ 2;
+}
+
+void main() {
+ // Function expression
+ var list = [true];
+ list.where(
+ (_, [_]) => true,
+ );
+
+ // Abstract methods
+ var abstractMethod = AbstractMethodSubclass();
+ abstractMethod.abstractMethod(1, 2);
+ abstractMethod.abstractMethod2(1, 2);
+ abstractMethod.abstractMethod_functionType(() {}, () {});
+
+ // Static methods
+ StaticMethod.staticMethod(1, 2);
+ StaticMethod.staticMethod2(1, 2);
+ StaticMethod.staticMethod_functionType(() {}, () {});
+ StaticMethod.staticMethod_functionTypeNested((e, x) {}, (e, x) {});
+ StaticMethod.staticMethod_functionTypeNew((e, x) {}, (e, x) {});
+ StaticMethod.staticMethod_functionTypeNested((_, _) {}, (_, _) {});
+ StaticMethod.staticMethod_functionTypeNew((_, _) {}, (_, _) {});
+
+ // Top level functions
+ topLevelFunction(1, 2);
+ topLevelFunction2(1, 2);
+ topLevelFunction_functionType(() {}, () {});
+
+ // Instance methods
+ var instanceMethod = InstanceMethod();
+ instanceMethod.instanceMethod(1, 2);
+ instanceMethod.instanceMethod2(1, 2);
+ instanceMethod.instanceMethod_functionType(() {}, () {});
+ Expect.equals(42, instanceMethod + 2);
+ instanceMethod[1] = 2;
+ Expect.isTrue(instanceMethod == 2);
+ Expect.isTrue((instanceMethod as dynamic).noMethod());
+
+ // Constructor
+ Constructor.multiple(1, 2, () {});
+ Constructor.parameter(1, 2, 3);
+ Constructor.functionType(() {}, () {}, () {});
+
+ // Setter
+ var setter = Setter(1);
+ setter.x = 2;
+}
diff --git a/tests/language/wildcard_variables/multiple/local_declaration_local_test.dart b/tests/language/wildcard_variables/multiple/local_declaration_local_test.dart
new file mode 100644
index 0000000..23a3683
--- /dev/null
+++ b/tests/language/wildcard_variables/multiple/local_declaration_local_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests multiple local wildcard variable declarations.
+
+// SharedOptions=--enable-experiment=wildcard-variables
+
+void main() {
+ var _ = 1;
+ int _ = 2;
+ final _ = 3;
+
+ var i = 2, _ = 2;
+ i = i + 1;
+
+ int _;
+ final _;
+}
diff --git a/tests/language/wildcard_variables/multiple/local_declaration_type_parameter_test.dart b/tests/language/wildcard_variables/multiple/local_declaration_type_parameter_test.dart
new file mode 100644
index 0000000..6ea49a6
--- /dev/null
+++ b/tests/language/wildcard_variables/multiple/local_declaration_type_parameter_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests multiple wildcard generic type parameters.
+
+// SharedOptions=--enable-experiment=wildcard-variables
+
+// Class type parameters
+class T<_, _> {}
+
+typedef ForgetfulMap<_, _> = Map<Object?, Object?>;
+typedef F<_, X, _> = X Function<_ extends X>(X _, X _);
+
+// Function type parameters
+void genericFunction<_, _>() {}
+void genericFunction2<_ extends Iterable<int>, _ extends num>() {}
+void genericFunction3<_ extends void Function<_>(_, _), _>() {}
+
+void main() {
+ void genericCallback(bool Function<T, E>() func) {}
+ genericCallback(<_, _>() => true);
+}