Skip to content

Commit c8f07e6

Browse files
chloestefantsovaCommit Queue
authored and
Commit Queue
committed
[cfe] Remove outdated null check to allow for-in pattern entries
Part of #49749 Closes #51489 Change-Id: I1e598f8742a271e63023f95122d8166204721aeb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/284920 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent e5ea38a commit c8f07e6

10 files changed

+420
-1
lines changed

pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4348,7 +4348,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
43484348
ForInResult result;
43494349
if (entry.variable.name == null) {
43504350
result = handleForInWithoutVariable(entry, entry.variable,
4351-
entry.iterable, entry.syntheticAssignment!, entry.expressionEffects,
4351+
entry.iterable, entry.syntheticAssignment, entry.expressionEffects,
43524352
isAsync: entry.isAsync, hasProblem: entry.problem != null);
43534353
} else {
43544354
result = handleForInDeclaringVariable(
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
test1() => <dynamic, dynamic>{for (var [i] in []) i: i};
6+
7+
test2(dynamic x, dynamic another) => {
8+
1: 1,
9+
for (var [i] in x) for (var [j] in x) ...another,
10+
};
11+
12+
13+
main() {
14+
expectEquals(
15+
mapToString(test1()),
16+
mapToString({}),
17+
);
18+
expectEquals(
19+
mapToString(test2([], {2: 2})),
20+
mapToString({1: 1}),
21+
);
22+
expectEquals(
23+
mapToString(test2([[0], [1], [2]], {2: 2})),
24+
mapToString({1: 1, 2: 2}),
25+
);
26+
}
27+
28+
expectEquals(x, y) {
29+
if (x != y) {
30+
throw "Expected '${x}' to be equal to '${y}'.";
31+
}
32+
}
33+
34+
mapToString(Map map) {
35+
List<String> entryStrings = [for (var e in map.entries) "${e.key}:${e.value}"];
36+
entryStrings.sort();
37+
return "{${entryStrings.join(',')}}";
38+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:_internal" as _in;
5+
6+
static method test1() → dynamic
7+
return block {
8+
final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
9+
for (final dynamic #t2 in <dynamic>[]) {
10+
dynamic i;
11+
{
12+
final dynamic #0#0 = #t2;
13+
if(!(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t3 = i = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
14+
throw new _in::ReachabilityError::•();
15+
}
16+
#t1.{core::Map::[]=}{Invariant}(i, i){(dynamic, dynamic) → void};
17+
}
18+
} =>#t1;
19+
static method test2(dynamic x, dynamic another) → dynamic
20+
return block {
21+
final core::Map<dynamic, dynamic> #t4 = <dynamic, dynamic>{};
22+
#t4.{core::Map::[]=}{Invariant}(1, 1){(dynamic, dynamic) → void};
23+
for (final dynamic #t5 in x as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
24+
dynamic i;
25+
{
26+
final dynamic #0#0 = #t5;
27+
if(!(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t6 = i = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
28+
throw new _in::ReachabilityError::•();
29+
}
30+
for (final dynamic #t7 in x as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
31+
dynamic j;
32+
{
33+
final dynamic #1#0 = #t7;
34+
if(!(#1#0 is{ForNonNullableByDefault} core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t8 = j = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
35+
throw new _in::ReachabilityError::•();
36+
}
37+
#t4.{core::Map::addAll}{Invariant}(another as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>){(core::Map<dynamic, dynamic>) → void};
38+
}
39+
}
40+
} =>#t4;
41+
static method main() → dynamic {
42+
self::expectEquals(self::mapToString(self::test1() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{}));
43+
self::expectEquals(self::mapToString(self::test2(<dynamic>[], <core::int, core::int>{2: 2}) as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{1: 1}));
44+
self::expectEquals(self::mapToString(self::test2(<core::List<core::int>>[<core::int>[0], <core::int>[1], <core::int>[2]], <core::int, core::int>{2: 2}) as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{1: 1, 2: 2}));
45+
}
46+
static method expectEquals(dynamic x, dynamic y) → dynamic {
47+
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
48+
throw "Expected '${x}' to be equal to '${y}'.";
49+
}
50+
}
51+
static method mapToString(core::Map<dynamic, dynamic> map) → dynamic {
52+
core::List<core::String> entryStrings = block {
53+
final core::List<core::String> #t9 = <core::String>[];
54+
for (core::MapEntry<dynamic, dynamic> e in map.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
55+
#t9.{core::List::add}{Invariant}("${e.{core::MapEntry::key}{dynamic}}:${e.{core::MapEntry::value}{dynamic}}"){(core::String) → void};
56+
} =>#t9;
57+
entryStrings.{core::List::sort}(){([(core::String, core::String) →? core::int]) → void};
58+
return "{${entryStrings.{core::Iterable::join}(","){([core::String]) → core::String}}}";
59+
}
60+
61+
constants {
62+
#C1 = 1
63+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:_internal" as _in;
5+
6+
static method test1() → dynamic
7+
return block {
8+
final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
9+
{
10+
core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::•<dynamic>(0).{core::Iterable::iterator}{core::Iterator<dynamic>};
11+
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
12+
final dynamic #t2 = :sync-for-iterator.{core::Iterator::current}{dynamic};
13+
{
14+
dynamic i;
15+
{
16+
final dynamic #0#0 = #t2;
17+
if(!(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t3 = i = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
18+
throw new _in::ReachabilityError::•();
19+
}
20+
#t1.{core::Map::[]=}{Invariant}(i, i){(dynamic, dynamic) → void};
21+
}
22+
}
23+
}
24+
} =>#t1;
25+
static method test2(dynamic x, dynamic another) → dynamic
26+
return block {
27+
final core::Map<dynamic, dynamic> #t4 = <dynamic, dynamic>{};
28+
#t4.{core::Map::[]=}{Invariant}(1, 1){(dynamic, dynamic) → void};
29+
{
30+
core::Iterator<dynamic> :sync-for-iterator = (x as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator}{core::Iterator<dynamic>};
31+
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
32+
final dynamic #t5 = :sync-for-iterator.{core::Iterator::current}{dynamic};
33+
{
34+
dynamic i;
35+
{
36+
final dynamic #0#0 = #t5;
37+
if(!(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t6 = i = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
38+
throw new _in::ReachabilityError::•();
39+
}
40+
{
41+
core::Iterator<dynamic> :sync-for-iterator = (x as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator}{core::Iterator<dynamic>};
42+
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
43+
final dynamic #t7 = :sync-for-iterator.{core::Iterator::current}{dynamic};
44+
{
45+
dynamic j;
46+
{
47+
final dynamic #1#0 = #t7;
48+
if(!(#1#0 is{ForNonNullableByDefault} core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t8 = j = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
49+
throw new _in::ReachabilityError::•();
50+
}
51+
#t4.{core::Map::addAll}{Invariant}(another as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>){(core::Map<dynamic, dynamic>) → void};
52+
}
53+
}
54+
}
55+
}
56+
}
57+
}
58+
} =>#t4;
59+
static method main() → dynamic {
60+
self::expectEquals(self::mapToString(self::test1() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{}));
61+
self::expectEquals(self::mapToString(self::test2(core::_GrowableList::•<dynamic>(0), <core::int, core::int>{2: 2}) as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{1: 1}));
62+
self::expectEquals(self::mapToString(self::test2(core::_GrowableList::_literal3<core::List<core::int>>(core::_GrowableList::_literal1<core::int>(0), core::_GrowableList::_literal1<core::int>(1), core::_GrowableList::_literal1<core::int>(2)), <core::int, core::int>{2: 2}) as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{1: 1, 2: 2}));
63+
}
64+
static method expectEquals(dynamic x, dynamic y) → dynamic {
65+
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
66+
throw "Expected '${x}' to be equal to '${y}'.";
67+
}
68+
}
69+
static method mapToString(core::Map<dynamic, dynamic> map) → dynamic {
70+
core::List<core::String> entryStrings = block {
71+
final core::List<core::String> #t9 = core::_GrowableList::•<core::String>(0);
72+
{
73+
core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = map.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>};
74+
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
75+
core::MapEntry<dynamic, dynamic> e = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
76+
#t9.{core::List::add}{Invariant}("${e.{core::MapEntry::key}{dynamic}}:${e.{core::MapEntry::value}{dynamic}}"){(core::String) → void};
77+
}
78+
}
79+
} =>#t9;
80+
entryStrings.{core::List::sort}(){([(core::String, core::String) →? core::int]) → void};
81+
return "{${entryStrings.{core::Iterable::join}(","){([core::String]) → core::String}}}";
82+
}
83+
84+
constants {
85+
#C1 = 1
86+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
test1() => <dynamic, dynamic>{for (var [;i;] in []) i: i};
2+
test2(dynamic x, dynamic another) => { 1: 1, for (var [;i;] in x) for (var [;j;] in x) ...another, };
3+
main() {}
4+
expectEquals(x, y) {}
5+
mapToString(Map map) {}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:_internal" as _in;
5+
6+
static method test1() → dynamic
7+
return block {
8+
final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
9+
for (final dynamic #t2 in <dynamic>[]) {
10+
dynamic i;
11+
{
12+
final dynamic #0#0 = #t2;
13+
if(!(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t3 = i = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
14+
throw new _in::ReachabilityError::•();
15+
}
16+
#t1.{core::Map::[]=}{Invariant}(i, i){(dynamic, dynamic) → void};
17+
}
18+
} =>#t1;
19+
static method test2(dynamic x, dynamic another) → dynamic
20+
return block {
21+
final core::Map<dynamic, dynamic> #t4 = <dynamic, dynamic>{};
22+
#t4.{core::Map::[]=}{Invariant}(1, 1){(dynamic, dynamic) → void};
23+
for (final dynamic #t5 in x as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
24+
dynamic i;
25+
{
26+
final dynamic #0#0 = #t5;
27+
if(!(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t6 = i = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
28+
throw new _in::ReachabilityError::•();
29+
}
30+
for (final dynamic #t7 in x as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
31+
dynamic j;
32+
{
33+
final dynamic #1#0 = #t7;
34+
if(!(#1#0 is{ForNonNullableByDefault} core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t8 = j = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
35+
throw new _in::ReachabilityError::•();
36+
}
37+
#t4.{core::Map::addAll}{Invariant}(another as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>){(core::Map<dynamic, dynamic>) → void};
38+
}
39+
}
40+
} =>#t4;
41+
static method main() → dynamic {
42+
self::expectEquals(self::mapToString(self::test1() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{}));
43+
self::expectEquals(self::mapToString(self::test2(<dynamic>[], <core::int, core::int>{2: 2}) as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{1: 1}));
44+
self::expectEquals(self::mapToString(self::test2(<core::List<core::int>>[<core::int>[0], <core::int>[1], <core::int>[2]], <core::int, core::int>{2: 2}) as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{1: 1, 2: 2}));
45+
}
46+
static method expectEquals(dynamic x, dynamic y) → dynamic {
47+
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
48+
throw "Expected '${x}' to be equal to '${y}'.";
49+
}
50+
}
51+
static method mapToString(core::Map<dynamic, dynamic> map) → dynamic {
52+
core::List<core::String> entryStrings = block {
53+
final core::List<core::String> #t9 = <core::String>[];
54+
for (core::MapEntry<dynamic, dynamic> e in map.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
55+
#t9.{core::List::add}{Invariant}("${e.{core::MapEntry::key}{dynamic}}:${e.{core::MapEntry::value}{dynamic}}"){(core::String) → void};
56+
} =>#t9;
57+
entryStrings.{core::List::sort}(){([(core::String, core::String) →? core::int]) → void};
58+
return "{${entryStrings.{core::Iterable::join}(","){([core::String]) → core::String}}}";
59+
}
60+
61+
constants {
62+
#C1 = 1
63+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:_internal" as _in;
5+
6+
static method test1() → dynamic
7+
return block {
8+
final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
9+
for (final dynamic #t2 in <dynamic>[]) {
10+
dynamic i;
11+
{
12+
final dynamic #0#0 = #t2;
13+
if(!(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t3 = i = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
14+
throw new _in::ReachabilityError::•();
15+
}
16+
#t1.{core::Map::[]=}{Invariant}(i, i){(dynamic, dynamic) → void};
17+
}
18+
} =>#t1;
19+
static method test2(dynamic x, dynamic another) → dynamic
20+
return block {
21+
final core::Map<dynamic, dynamic> #t4 = <dynamic, dynamic>{};
22+
#t4.{core::Map::[]=}{Invariant}(1, 1){(dynamic, dynamic) → void};
23+
for (final dynamic #t5 in x as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
24+
dynamic i;
25+
{
26+
final dynamic #0#0 = #t5;
27+
if(!(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t6 = i = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
28+
throw new _in::ReachabilityError::•();
29+
}
30+
for (final dynamic #t7 in x as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
31+
dynamic j;
32+
{
33+
final dynamic #1#0 = #t7;
34+
if(!(#1#0 is{ForNonNullableByDefault} core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t8 = j = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)))
35+
throw new _in::ReachabilityError::•();
36+
}
37+
#t4.{core::Map::addAll}{Invariant}(another as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>){(core::Map<dynamic, dynamic>) → void};
38+
}
39+
}
40+
} =>#t4;
41+
static method main() → dynamic {
42+
self::expectEquals(self::mapToString(self::test1() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{}));
43+
self::expectEquals(self::mapToString(self::test2(<dynamic>[], <core::int, core::int>{2: 2}) as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{1: 1}));
44+
self::expectEquals(self::mapToString(self::test2(<core::List<core::int>>[<core::int>[0], <core::int>[1], <core::int>[2]], <core::int, core::int>{2: 2}) as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>), self::mapToString(<dynamic, dynamic>{1: 1, 2: 2}));
45+
}
46+
static method expectEquals(dynamic x, dynamic y) → dynamic {
47+
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
48+
throw "Expected '${x}' to be equal to '${y}'.";
49+
}
50+
}
51+
static method mapToString(core::Map<dynamic, dynamic> map) → dynamic {
52+
core::List<core::String> entryStrings = block {
53+
final core::List<core::String> #t9 = <core::String>[];
54+
for (core::MapEntry<dynamic, dynamic> e in map.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
55+
#t9.{core::List::add}{Invariant}("${e.{core::MapEntry::key}{dynamic}}:${e.{core::MapEntry::value}{dynamic}}"){(core::String) → void};
56+
} =>#t9;
57+
entryStrings.{core::List::sort}(){([(core::String, core::String) →? core::int]) → void};
58+
return "{${entryStrings.{core::Iterable::join}(","){([core::String]) → core::String}}}";
59+
}
60+
61+
constants {
62+
#C1 = 1
63+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
static method test1() → dynamic
6+
;
7+
static method test2(dynamic x, dynamic another) → dynamic
8+
;
9+
static method main() → dynamic
10+
;
11+
static method expectEquals(dynamic x, dynamic y) → dynamic
12+
;
13+
static method mapToString(core::Map<dynamic, dynamic> map) → dynamic
14+
;

0 commit comments

Comments
 (0)