Skip to content

Commit d95a368

Browse files
committed
Update dart:collection.
This doesn't include the copious changes in collection_patch.dart because I believe (1) those are quite old and (2) are dart2js specific. The changes here have basically no effect on DDC, but it at least gets us a little better test coverage and reduces noise in the diffs. [email protected] Review URL: https://codereview.chromium.org/1977003002 .
1 parent 0cedeb4 commit d95a368

File tree

12 files changed

+302
-26
lines changed

12 files changed

+302
-26
lines changed

pkg/dev_compiler/lib/runtime/dart_sdk.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21405,8 +21405,10 @@ dart_library.library('dart_sdk', null, /* Imports */[
2140521405
}
2140621406
static from(elements) {
2140721407
let result = collection.HashSet$(E).new();
21408-
for (let e of elements)
21409-
result.add(dart.as(e, E));
21408+
for (let e of elements) {
21409+
let element = dart.as(e, E);
21410+
result.add(element);
21411+
}
2141021412
return result;
2141121413
}
2141221414
[Symbol.iterator]() {
@@ -21911,7 +21913,8 @@ dart_library.library('dart_sdk', null, /* Imports */[
2191121913
static from(elements) {
2191221914
let result = collection.LinkedHashSet$(E).new();
2191321915
for (let element of elements) {
21914-
result.add(dart.as(element, E));
21916+
let e = dart.as(element, E);
21917+
result.add(e);
2191521918
}
2191621919
return result;
2191721920
}
@@ -22808,7 +22811,8 @@ dart_library.library('dart_sdk', null, /* Imports */[
2280822811
static from(elements) {
2280922812
let list = new (collection.DoubleLinkedQueue$(E))();
2281022813
for (let e of elements) {
22811-
list.addLast(dart.as(e, E));
22814+
let element = dart.as(e, E);
22815+
list.addLast(element);
2281222816
}
2281322817
return dart.as(list, collection.DoubleLinkedQueue$(E));
2281422818
}
@@ -24015,7 +24019,8 @@ dart_library.library('dart_sdk', null, /* Imports */[
2401524019
if (isValidKey === void 0) isValidKey = null;
2401624020
let result = new (collection.SplayTreeSet$(E))(compare, isValidKey);
2401724021
for (let element of elements) {
24018-
result.add(dart.as(element, E));
24022+
let e = dart.as(element, E);
24023+
result.add(e);
2401924024
}
2402024025
return result;
2402124026
}

pkg/dev_compiler/test/codegen/corelib/set_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,5 +523,5 @@ main() {
523523
testASetFrom((x) => new Set<A>.from(x));
524524
testASetFrom((x) => new HashSet<A>.from(x));
525525
testASetFrom((x) => new LinkedHashSet<A>.from(x));
526-
testASetFrom((x) => new SplayTreeSet<A>.from(x));
526+
testASetFrom((x) => new SplayTreeSet<A>.from(x, identityCompare));
527527
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright (c) 2011, 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+
import "dart:collection";
6+
import "package:expect/expect.dart";
7+
8+
void main() {
9+
// Test customized maps.
10+
// Regression test for issue http://dartbug.com/18109
11+
12+
hash(s) => s.toLowerCase().hashCode;
13+
equals(a, b) => a.toLowerCase() == b.toLowerCase();
14+
15+
for (var m in [
16+
new HashMap<String,int>(equals: equals, hashCode: hash),
17+
new LinkedHashMap<String,int>(equals: equals, hashCode: hash),
18+
]) {
19+
m["Abel"] = 42;
20+
for (var key in ["Abel", "abel", "ABEL", "Abel"]) {
21+
Expect.isTrue(m.containsKey(key), "contains $key in ${m.runtimeType} $m");
22+
Expect.equals(42, m[key], "get $key in ${m.runtimeType} $m");
23+
Expect.equals(42, m.remove(key), "remove $key in ${m.runtimeType} $m");
24+
m[key] = 42;
25+
}
26+
}
27+
28+
abshash(n) => n.abs();
29+
abseq(a, b) => a.abs() == b.abs();
30+
for (var m in [
31+
new HashMap<int,int>(equals: abseq, hashCode: abshash),
32+
new LinkedHashMap<int,int>(equals: abseq, hashCode: abshash),
33+
]) {
34+
m[1] = 42;
35+
for (var key in [1, -1, 1]) {
36+
Expect.isTrue(m.containsKey(key), "contains $key in ${m.runtimeType} $m");
37+
Expect.equals(42, m[key], "get $key in ${m.runtimeType} $m");
38+
Expect.equals(42, m.remove(key), "remove $key in ${m.runtimeType} $m");
39+
m[key] = 42;
40+
}
41+
}
42+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (c) 2011, 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+
import "dart:collection";
6+
import "package:expect/expect.dart";
7+
8+
void main() {
9+
// Test customized sets.
10+
// Regression test for issue http://dartbug.com/18109
11+
12+
hash(s) => s.toLowerCase().hashCode;
13+
equals(a, b) => a.toLowerCase() == b.toLowerCase();
14+
15+
for (var m in [
16+
new HashSet<String>(equals: equals, hashCode: hash),
17+
new LinkedHashSet<String>(equals: equals, hashCode: hash),
18+
]) {
19+
m.add("Abel");
20+
var prev = "Abel";
21+
for (var key in ["Abel", "abel", "ABEL", "Abel"]) {
22+
Expect.isTrue(m.contains(key), "contains $key in ${m.runtimeType} $m");
23+
Expect.equals(prev, m.lookup(key), "lookup $key in ${m.runtimeType} $m");
24+
Expect.isTrue(m.remove(key), "remove $key in ${m.runtimeType} $m");
25+
m.add(key);
26+
prev = key;
27+
}
28+
}
29+
30+
abshash(n) => n.abs();
31+
abseq(a, b) => a.abs() == b.abs();
32+
for (var m in [
33+
new HashSet<int>(equals: abseq, hashCode: abshash),
34+
new LinkedHashSet<int>(equals: abseq, hashCode: abshash),
35+
]) {
36+
m.add(1);
37+
var prev = 1;
38+
for (var key in [1, -1, 1]) {
39+
Expect.isTrue(m.contains(key), "contains $key in ${m.runtimeType} $m");
40+
Expect.equals(prev, m.lookup(key), "lookup $key in ${m.runtimeType} $m");
41+
Expect.isTrue(m.remove(key), "remove $key in ${m.runtimeType} $m");
42+
m.add(key);
43+
prev = key;
44+
}
45+
}
46+
}
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
// Copyright (c) 2013, 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+
import 'dart:collection';
6+
import "package:expect/expect.dart";
7+
8+
class MyEntry extends LinkedListEntry<MyEntry> {
9+
final int value;
10+
11+
MyEntry(int this.value);
12+
13+
String toString() => value.toString();
14+
}
15+
16+
17+
testInsert() {
18+
// Insert last.
19+
var list = new LinkedList<MyEntry>();
20+
for (int i = 0; i < 10; i++) {
21+
list.add(new MyEntry(i));
22+
}
23+
24+
Expect.equals(10, list.length);
25+
26+
int i = 0;
27+
for (var entry in list) {
28+
Expect.equals(i, entry.value);
29+
i++;
30+
}
31+
32+
Expect.equals(10, i);
33+
34+
list.clear();
35+
36+
// Insert first.
37+
for (int i = 0; i < 10; i++) {
38+
list.addFirst(new MyEntry(i));
39+
}
40+
41+
Expect.equals(10, list.length);
42+
43+
i = 10;
44+
for (var entry in list) {
45+
Expect.equals(--i, entry.value);
46+
}
47+
Expect.equals(0, i);
48+
49+
list.clear();
50+
51+
// Insert after.
52+
list.addFirst(new MyEntry(0));
53+
for (int i = 1; i < 10; i++) {
54+
list.last.insertAfter(new MyEntry(i));
55+
}
56+
57+
Expect.equals(10, list.length);
58+
59+
i = 0;
60+
for (var entry in list) {
61+
Expect.equals(i, entry.value);
62+
i++;
63+
}
64+
65+
Expect.equals(10, i);
66+
67+
list.clear();
68+
69+
// Insert before.
70+
list.addFirst(new MyEntry(0));
71+
for (int i = 1; i < 10; i++) {
72+
list.first.insertBefore(new MyEntry(i));
73+
}
74+
75+
Expect.equals(10, list.length);
76+
77+
i = 10;
78+
for (var entry in list) {
79+
Expect.equals(--i, entry.value);
80+
}
81+
Expect.equals(0, i);
82+
83+
list.clear();
84+
}
85+
86+
87+
testRemove() {
88+
var list = new LinkedList<MyEntry>();
89+
for (int i = 0; i < 10; i++) {
90+
list.add(new MyEntry(i));
91+
}
92+
93+
Expect.equals(10, list.length);
94+
95+
list.remove(list.skip(5).first);
96+
97+
Expect.equals(9, list.length);
98+
99+
int i = 0;
100+
for (var entry in list) {
101+
if (i == 5) i++;
102+
Expect.equals(i, entry.value);
103+
i++;
104+
}
105+
106+
Expect.listEquals([0, 1, 2, 3, 4, 6, 7, 8, 9],
107+
list.map((e) => e.value).toList());
108+
109+
for (int i = 0; i < 9; i++) {
110+
list.first.unlink();
111+
}
112+
113+
Expect.throws(() => list.first);
114+
115+
Expect.equals(0, list.length);
116+
}
117+
118+
119+
testBadAdd() {
120+
var list1 = new LinkedList<MyEntry>();
121+
list1.addFirst(new MyEntry(0));
122+
123+
var list2 = new LinkedList<MyEntry>();
124+
Expect.throws(() => list2.addFirst(list1.first));
125+
126+
Expect.throws(() => new MyEntry(0).unlink());
127+
}
128+
129+
testConcurrentModificationError() {
130+
131+
test(function(LinkedList ll)) {
132+
var ll = new LinkedList<MyEntry>();
133+
for (int i = 0; i < 10; i++) {
134+
ll.add(new MyEntry(i));
135+
}
136+
Expect.throws(() => function(ll), (e) => e is ConcurrentModificationError);
137+
}
138+
test((ll) { for(var x in ll) { ll.remove(x); } });
139+
test((ll) { ll.forEach((x) { ll.remove(x); }); });
140+
test((ll) { ll.any((x) { ll.remove(x); return false; }); });
141+
test((ll) { ll.every((x) { ll.remove(x); return true; }); });
142+
test((ll) { ll.fold(0, (x, y) { ll.remove(y); return x; }); });
143+
test((ll) { ll.reduce((x, y) { ll.remove(y); return x; }); });
144+
test((ll) { ll.where((x) { ll.remove(x); return true; }).forEach((_) {}); });
145+
test((ll) { ll.map((x) { ll.remove(x); return x; }).forEach((_) {}); });
146+
test((ll) { ll.expand((x) { ll.remove(x); return[x];}).forEach((_) {}); });
147+
test((ll) { ll.takeWhile((x) {
148+
ll.remove(x); return true;}).forEach((_) {}); });
149+
test((ll) { ll.skipWhile((x) {
150+
ll.remove(x); return true;}).forEach((_) {}); });
151+
test((ll) {
152+
bool first = true;
153+
ll.firstWhere((x) {
154+
ll.remove(x);
155+
if (!first) return true;
156+
return first = false;
157+
});
158+
});
159+
test((ll) { ll.lastWhere((x) { ll.remove(x); return true;}); });
160+
test((ll) {
161+
bool first = true;
162+
ll.singleWhere((x) {
163+
ll.remove(x);
164+
if (!first) return false;
165+
return !(first = false);
166+
});
167+
});
168+
}
169+
170+
main() {
171+
testInsert();
172+
testRemove();
173+
testBadAdd();
174+
testConcurrentModificationError();
175+
}

pkg/dev_compiler/tool/input_sdk/lib/collection/hash_map.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ abstract class HashMap<K, V> implements Map<K, V> {
102102
*/
103103
factory HashMap.from(Map other) {
104104
HashMap<K, V> result = new HashMap<K, V>();
105-
other.forEach((k, v) { result[k as K] = v as V; });
105+
other.forEach((k, v) { result[k as Object/*=K*/] = v as Object/*=V*/; });
106106
return result;
107107
}
108108

pkg/dev_compiler/tool/input_sdk/lib/collection/hash_set.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,10 @@ abstract class HashSet<E> implements Set<E> {
121121
*/
122122
factory HashSet.from(Iterable elements) {
123123
HashSet<E> result = new HashSet<E>();
124-
for (final e in elements) result.add(e as E);
124+
for (final e in elements) {
125+
E element = e as Object/*=E*/;
126+
result.add(element);
127+
}
125128
return result;
126129
}
127130

pkg/dev_compiler/tool/input_sdk/lib/collection/linked_hash_map.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ abstract class LinkedHashMap<K, V> implements HashMap<K, V> {
8989
*/
9090
factory LinkedHashMap.from(Map other) {
9191
LinkedHashMap<K, V> result = new LinkedHashMap<K, V>();
92-
other.forEach((k, v) { result[k as K] = v as V; });
92+
other.forEach((k, v) { result[k as Object/*=K*/] = v as Object/*=V*/; });
9393
return result;
9494
}
9595

pkg/dev_compiler/tool/input_sdk/lib/collection/linked_hash_set.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ abstract class LinkedHashSet<E> implements HashSet<E> {
105105
factory LinkedHashSet.from(Iterable elements) {
106106
LinkedHashSet<E> result = new LinkedHashSet<E>();
107107
for (final element in elements) {
108-
result.add(element as E);
108+
E e = element as Object/*=E*/;
109+
result.add(e);
109110
}
110111
return result;
111112
}

pkg/dev_compiler/tool/input_sdk/lib/collection/linked_list.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,6 @@ abstract class LinkedListEntry<E extends LinkedListEntry<E>> {
296296
* The [entry] must not be in a linked list.
297297
*/
298298
void insertBefore(E entry) {
299-
_list._insertBefore(this as E, entry, updateFirst: true);
299+
_list._insertBefore(this as dynamic/*=E*/, entry, updateFirst: true);
300300
}
301301
}

pkg/dev_compiler/tool/input_sdk/lib/collection/queue.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,8 @@ class DoubleLinkedQueue<E> extends Iterable<E> implements Queue<E> {
293293
factory DoubleLinkedQueue.from(Iterable elements) {
294294
Queue<E> list = new DoubleLinkedQueue<E>();
295295
for (final e in elements) {
296-
list.addLast(e as E);
296+
E element = e as Object/*=E*/;
297+
list.addLast(element);
297298
}
298299
return list;
299300
}
@@ -498,7 +499,7 @@ class ListQueue<E> extends Iterable<E> implements Queue<E> {
498499
ListQueue<E> queue = new ListQueue(length + 1);
499500
assert(queue._table.length > length);
500501
for (int i = 0; i < length; i++) {
501-
queue._table[i] = elements[i] as E;
502+
queue._table[i] = elements[i] as Object/*=E*/;
502503
}
503504
queue._tail = length;
504505
return queue;
@@ -509,7 +510,7 @@ class ListQueue<E> extends Iterable<E> implements Queue<E> {
509510
}
510511
ListQueue<E> result = new ListQueue<E>(capacity);
511512
for (final element in elements) {
512-
result.addLast(element as E);
513+
result.addLast(element as Object/*=E*/);
513514
}
514515
return result;
515516
}

0 commit comments

Comments
 (0)