Version 2.14.0-67.0.dev
Merge commit 'c75ca5a6136c2018aa1254708d564f0d521efe69' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 7109004..97dc6a1 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
"constraint, update this by running tools/generate_package_config.dart."
],
"configVersion": 2,
- "generated": "2021-04-29T17:48:25.665083",
+ "generated": "2021-04-30T12:11:55.367820",
"generator": "tools/generate_package_config.dart",
"packages": [
{
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 842903d..0c0ae9b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -223,8 +223,11 @@
## 2.12.3 - 2021-04-14
This is a patch release that fixes a vulnerability in `dart:html` related to
-DOM clobbering. Thanks again to **Vincenzo di Cicco** for finding and reporting
-this vulnerability.
+DOM clobbering. See the [vulnerability advisory][CVE-2021-22540] for more
+details. Thanks again to **Vincenzo di Cicco** for finding and reporting this
+vulnerability.
+
+[CVE-2021-22540]: https://github.com/dart-lang/sdk/security/advisories/GHSA-3rfv-4jvg-9522
## 2.12.2 - 2021-03-17
diff --git a/DEPS b/DEPS
index 78974f4..d4ba74c 100644
--- a/DEPS
+++ b/DEPS
@@ -114,7 +114,7 @@
"glob_rev": "a62acf590598f458d3198d9f2930c1c9dd4b1379",
"html_rev": "00cd3c22dac0e68e6ed9e7e4945101aedb1b3109",
"http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
- "http_multi_server_rev" : "7aca9e87d4a68374b685334f20359320054b8d7b",
+ "http_multi_server_rev": "de1b312164c24a1690b46c6e97bd47eff40c4649",
"http_parser_rev": "7720bfd42a0c096734c5213478fdce92c62f0293",
"http_retry_rev": "845771af7bb5ab38ab740ce4a31f3b0c7680302b",
"http_rev": "14e4fece54591436c1e3083df350b8e142067ae7",
@@ -170,7 +170,7 @@
"watcher_rev": "3924194385fb215cef483193ed2879a618a3d69c",
"webdriver_rev": "ff5ccb1522edf4bed578ead4d65e0cbc1f2c4f02",
"web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
- "web_socket_channel_rev": "d3e100de8feb0283a04732366bb591ebd2282d7d",
+ "web_socket_channel_rev": "6448ce532445a8a458fa191d9346df071ae0acad",
"WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
"webkit_inspection_protocol_rev": "6b15729292d030f2e5c5861022da4c5a4c11961c",
"yaml_rev": "b4c4411631bda556ce9a45af1ab0eecaf9f3ac53",
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/statements_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/statements_test.dart
index 68ff856..a33675f 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/statements_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/statements_test.dart
@@ -8,16 +8,16 @@
main() {
defineReflectiveSuite(() {
- defineReflectiveTests(AssertWithNullSafetyTest);
- defineReflectiveTests(DoWithNullSafetyTest);
- defineReflectiveTests(ForWithNullSafetyTest);
- defineReflectiveTests(IfWithNullSafetyTest);
- defineReflectiveTests(WhileWithNullSafetyTest);
+ defineReflectiveTests(AssertTest);
+ defineReflectiveTests(DoTest);
+ defineReflectiveTests(ForTest);
+ defineReflectiveTests(IfTest);
+ defineReflectiveTests(WhileTest);
});
}
@reflectiveTest
-class AssertWithNullSafetyTest extends PubPackageResolutionTest {
+class AssertTest extends PubPackageResolutionTest {
test_downward() async {
await resolveTestCode('''
void f() {
@@ -30,7 +30,7 @@
}
@reflectiveTest
-class DoWithNullSafetyTest extends PubPackageResolutionTest {
+class DoTest extends PubPackageResolutionTest {
test_downward() async {
await resolveTestCode('''
void f() {
@@ -43,8 +43,18 @@
}
@reflectiveTest
-class ForWithNullSafetyTest extends PubPackageResolutionTest {
- test_awaitForIn_dynamic_downward() async {
+class ForTest extends PubPackageResolutionTest {
+ test_awaitForIn_int_downward() async {
+ await resolveTestCode('''
+void f() async {
+ await for (int e in a()) {}
+}
+T a<T>() => throw '';
+''');
+ assertInvokeType(findNode.methodInvocation('a('), 'Stream<int> Function()');
+ }
+
+ test_awaitForIn_var_downward() async {
await resolveTestCode('''
void f() async {
await for (var e in a()) {}
@@ -55,14 +65,15 @@
findNode.methodInvocation('a('), 'Stream<Object?> Function()');
}
- test_awaitForIn_int_downward() async {
+ test_awaitForIn_var_upward() async {
await resolveTestCode('''
-void f() async {
- await for (int e in a()) {}
+void f(Stream<int> s) async {
+ await for (var e in s) {
+ e;
+ }
}
-T a<T>() => throw '';
''');
- assertInvokeType(findNode.methodInvocation('a('), 'Stream<int> Function()');
+ assertType(findNode.simple('e;'), 'int');
}
test_for_downward() async {
@@ -96,10 +107,21 @@
assertInvokeType(
findNode.methodInvocation('a('), 'Iterable<int> Function()');
}
+
+ test_forIn_var_upward() async {
+ await resolveTestCode('''
+void f(List<int> s) async {
+ for (var e in s) {
+ e;
+ }
+}
+''');
+ assertType(findNode.simple('e;'), 'int');
+ }
}
@reflectiveTest
-class IfWithNullSafetyTest extends PubPackageResolutionTest {
+class IfTest extends PubPackageResolutionTest {
test_downward() async {
await resolveTestCode('''
void f() {
@@ -112,7 +134,7 @@
}
@reflectiveTest
-class WhileWithNullSafetyTest extends PubPackageResolutionTest {
+class WhileTest extends PubPackageResolutionTest {
test_downward() async {
await resolveTestCode('''
void f() {
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
index ff952a9..07478d0 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
@@ -15,6 +15,16 @@
@reflectiveTest
class ForInOfInvalidElementTypeTest extends PubPackageResolutionTest {
+ test_await_declaredVariable_dynamic() async {
+ await assertNoErrorsInCode('''
+f(dynamic a) async {
+ await for (int i in a) {
+ i;
+ }
+}
+''');
+ }
+
test_await_declaredVariableWrongType() async {
await assertErrorsInCode('''
f(Stream<String> stream) async {
@@ -54,6 +64,16 @@
]);
}
+ test_declaredVariable_dynamic() async {
+ await assertNoErrorsInCode('''
+f(dynamic a) {
+ for (int i in a) {
+ i;
+ }
+}
+''');
+ }
+
test_declaredVariable_interfaceTypeTypedef_ok() async {
await assertNoErrorsInCode('''
typedef S = String;
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
index 9f5acb2..c75dd89 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
@@ -10,13 +10,76 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ForInOfInvalidTypeTest);
- defineReflectiveTests(ForInOfInvalidTypeWithNullSafetyTest);
+ defineReflectiveTests(ForInOfInvalidTypeWithoutNullSafetyTest);
});
}
@reflectiveTest
class ForInOfInvalidTypeTest extends PubPackageResolutionTest
- with ForInOfInvalidTypeTestCases, WithoutNullSafetyMixin {}
+ with ForInOfInvalidTypeTestCases {
+ test_awaitForIn_never() async {
+ await assertErrorsInCode('''
+f(Never e) async {
+ await for (var id in e) {
+ id;
+ }
+}
+''', [
+ error(HintCode.DEAD_CODE, 32, 26),
+ ]);
+ // TODO(scheglov) extract for-in resolution and implement
+// assertType(findNode.simple('id;'), 'Never');
+ }
+
+ test_awaitForIn_object() async {
+ await assertErrorsInCode('''
+f(Object e) async {
+ await for (var id in e) {
+ id;
+ }
+}
+''', [
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 43, 1),
+ ]);
+ }
+
+ test_forIn_interfaceTypeTypedef_iterable() async {
+ await assertNoErrorsInCode('''
+typedef L = List<String>;
+f(L e) {
+ for (var id in e) {
+ id;
+ }
+}
+''');
+ }
+
+ test_forIn_never() async {
+ await assertErrorsInCode('''
+f(Never e) {
+ for (var id in e) {
+ id;
+ }
+}
+''', [
+ error(HintCode.DEAD_CODE, 20, 26),
+ ]);
+ // TODO(scheglov) extract for-in resolution and implement
+// assertType(findNode.simple('id;'), 'Never');
+ }
+
+ test_forIn_object() async {
+ await assertErrorsInCode('''
+f(Object e) async {
+ for (var id in e) {
+ id;
+ }
+}
+''', [
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 37, 1),
+ ]);
+ }
+}
mixin ForInOfInvalidTypeTestCases on PubPackageResolutionTest {
test_awaitForIn_dynamic() async {
@@ -41,6 +104,29 @@
]);
}
+ test_awaitForIn_streamOfDynamic() async {
+ await assertNoErrorsInCode('''
+f(Stream<dynamic> e) async {
+ await for (var id in e) {
+ id;
+ }
+}
+''');
+ }
+
+ test_awaitForIn_streamOfDynamicSubclass() async {
+ await assertNoErrorsInCode('''
+abstract class MyStream<T> extends Stream<T> {
+ factory MyStream() => throw 0;
+}
+f(MyStream<dynamic> e) async {
+ await for (var id in e) {
+ id;
+ }
+}
+''');
+ }
+
test_forIn_dynamic() async {
await assertNoErrorsInCode('''
f(dynamic e) {
@@ -75,44 +161,25 @@
}
@reflectiveTest
-class ForInOfInvalidTypeWithNullSafetyTest extends PubPackageResolutionTest
- with ForInOfInvalidTypeTestCases {
- test_awaitForIn_never() async {
- await assertErrorsInCode('''
-f(Never e) async {
- await for (var id in e) {
- id;
- }
-}
-''', [
- error(HintCode.DEAD_CODE, 32, 26),
- ]);
- // TODO(scheglov) extract for-in resolution and implement
-// assertType(findNode.simple('id;'), 'Never');
- }
-
- test_forIn_interfaceTypeTypedef_iterable() async {
+class ForInOfInvalidTypeWithoutNullSafetyTest extends PubPackageResolutionTest
+ with ForInOfInvalidTypeTestCases, WithoutNullSafetyMixin {
+ test_awaitForIn_object() async {
await assertNoErrorsInCode('''
-typedef L = List<String>;
-f(L e) {
- for (var id in e) {
+f(Object e) async {
+ await for (var id in e) {
id;
}
}
''');
}
- test_forIn_never() async {
- await assertErrorsInCode('''
-f(Never e) {
+ test_forIn_object() async {
+ await assertNoErrorsInCode('''
+f(Object e) async {
for (var id in e) {
id;
}
}
-''', [
- error(HintCode.DEAD_CODE, 20, 26),
- ]);
- // TODO(scheglov) extract for-in resolution and implement
-// assertType(findNode.simple('id;'), 'Never');
+''');
}
}
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 6a5a5cc..299a327 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -18,151 +18,6 @@
class CheckerTest extends PubPackageResolutionTest with WithoutNullSafetyMixin {
// TODO(https://github.com/dart-lang/sdk/issues/44666): Use null safety in
// test cases.
- test_awaitForInCastsStreamElementToVariable() async {
- await assertErrorsInCode('''
-abstract class MyStream<T> extends Stream<T> {
- factory MyStream() => throw 0;
-}
-
-main() async {
- // Don't choke if sequence is not stream.
- await for (var i in 1234) {}
-
- // Dynamic cast.
- await for (String s in new MyStream<dynamic>()) {}
-
- // Identity cast.
- await for (String s in new MyStream<String>()) {}
-
- // Untyped.
- await for (var s in new MyStream<String>()) {}
-
- // Downcast.
- await for (int i in new MyStream<num>()) {}
-}
-''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 159, 1),
- error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 164, 4),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 213, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 287, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 351, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 416, 1),
- ]);
- }
-
- test_awaitForInCastsSupertypeSequenceToStream() async {
- await assertErrorsInCode('''
-main() async {
- dynamic d;
- await for (var i in d) {}
-
- Object o;
- await for (var i in o) {}
-}
-''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 45, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 86, 1),
- ]);
- }
-
- test_binaryAndIndexOperators() async {
- await assertErrorsInCode('''
-class A {
- A operator *(B b) => null;
- A operator /(B b) => null;
- A operator ~/(B b) => null;
- A operator %(B b) => null;
- A operator +(B b) => null;
- A operator -(B b) => null;
- A operator <<(B b) => null;
- A operator >>(B b) => null;
- A operator &(B b) => null;
- A operator ^(B b) => null;
- A operator |(B b) => null;
- A operator[](B b) => null;
-}
-
-class B {
- A operator -(B b) => null;
-}
-
-foo() => new A();
-
-test() {
- A a = new A();
- B b = new B();
- var c = foo();
- a = a * b;
- a = a * c;
- a = a / b;
- a = a ~/ b;
- a = a % b;
- a = a + b;
- a = a + a;
- a = a - b;
- b = b - b;
- a = a << b;
- a = a >> b;
- a = a & b;
- a = a ^ b;
- a = a | b;
- c = (c + b);
-
- String x = 'hello';
- int y = 42;
- x = x + x;
- x = x + c;
- x = x + y;
-
- bool p = true;
- p = p && p;
- p = p && c;
- p = (c) && p;
- p = (c) && c;
- p = y && p;
- p = c == y;
-
- a = a[b];
- a = a[c];
- c = (c[b]);
- a[y];
-}
-''', [
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 574, 1),
- error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 596, 5),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 758, 1),
- error(CompileTimeErrorCode.NON_BOOL_OPERAND, 845, 1),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 910, 1),
- ]);
- }
-
- test_callMethodOnFunctions() async {
- await assertErrorsInCode(r'''
-void f(int x) => print(x);
-main() {
- f.call('hi');
-}
-''', [
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 45, 4),
- ]);
- }
-
- test_castsInConditions() async {
- await assertErrorsInCode('''
-main() {
- bool b = true;
- num x = b ? 1 : 2.3;
- int y = b ? 1 : 2.3;
- String z = !b ? "hello" : null;
- z = b ? null : "hello";
-}
-''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 32, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 55, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 81, 1),
- ]);
- }
-
test_castsInConstantContexts() async {
await assertErrorsInCode('''
class A {
@@ -945,67 +800,6 @@
]);
}
- test_forInCastsIterateElementToVariable() async {
- await assertErrorsInCode('''
-main() {
- // Don't choke if sequence is not iterable.
- for (var i in 1234) {}
-
- // Dynamic cast.
- for (String s in <dynamic>[]) {}
-
- // Identity cast.
- for (String s in <String>[]) {}
-
- // Untyped.
- for (var s in <String>[]) {}
-
- // Downcast.
- for (int i in <num>[]) {}
-}
-''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 66, 1),
- error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 71, 4),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 114, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 170, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 216, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 263, 1),
- ]);
- }
-
- test_forInCastsSupertypeSequenceToIterate() async {
- await assertErrorsInCode('''
-main() {
- dynamic d;
- for (var i in d) {}
-
- Object o;
- for (var i in o) {}
-}
-''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 33, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 68, 1),
- ]);
- }
-
- test_forLoopVariable() async {
- await assertErrorsInCode('''
-foo() {
- for (int i = 0; i < 10; i++) {
- i = "hi";
- }
-}
-bar() {
- for (var i = 0; i < 10; i++) {
- int j = i + 1;
- }
-}
-''', [
- error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 49, 4),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 110, 1),
- ]);
- }
-
test_functionModifiers_async() async {
await assertErrorsInCode('''
import 'dart:math' show Random;
@@ -2491,30 +2285,6 @@
);
}
- test_implicitCasts_forEach() async {
- await _assertImplicitCasts(r'''
-void f(dynamic a) {
- for (int v in a) {
- v;
- }
-}
-''', [
- error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 36, 1),
- ]);
- }
-
- test_implicitCasts_forEach_async() async {
- await _assertImplicitCasts(r'''
-void f(dynamic a) async {
- await for (int v in a) {
- v;
- }
-}
-''', [
- error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 48, 1),
- ]);
- }
-
test_implicitCasts_functionCall() async {
await _assertImplicitCasts(r'''
int f(int i) => i;
diff --git a/tools/VERSION b/tools/VERSION
index 48a84ad..59647e2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 66
+PRERELEASE 67
PRERELEASE_PATCH 0
\ No newline at end of file