Skip to content

Commit 7f4032e

Browse files
Sync changes from internal repo. (flutter#86)
* Fix type in PbList.fold() for Dart 2. * Small performance tweaks for DDC. Fixes #84. Fixes #85.
1 parent ee41255 commit 7f4032e

File tree

8 files changed

+55
-11
lines changed

8 files changed

+55
-11
lines changed

lib/meta.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const List<String> GeneratedMessage_reservedNames = const [
5151
'clone',
5252
r'$_get',
5353
r'$_getI64',
54+
r'$_getList',
5455
r'$_getN',
5556
r'$_getS',
5657
r'$_has',

lib/mixins_meta.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,23 @@ const List<String> _reservedNamesForMap = const [
7474
'[]',
7575
'[]=',
7676
'addAll',
77+
'addEntries',
78+
'cast',
7779
'containsKey',
7880
'containsValue',
81+
'entries',
7982
'forEach',
80-
'putIfAbsent',
81-
'remove',
8283
'isEmpty',
8384
'isNotEmpty',
8485
'keys',
8586
'length',
87+
'map',
88+
'putIfAbsent',
89+
'remove',
90+
'removeWhere',
91+
'retype',
92+
'update',
93+
'updateAll',
8694
'values',
8795
];
8896

lib/src/protobuf/field_info.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,5 +133,17 @@ class FieldInfo<T> {
133133
return m.createRepeatedField<T>(tagNumber, this);
134134
}
135135

136+
/// Same as above, but allow a tighter typed List to be created.
137+
List<S> _createRepeatedFieldWithType<S extends T>(GeneratedMessage m) {
138+
assert(isRepeated);
139+
return m.createRepeatedField<S>(tagNumber, this);
140+
}
141+
142+
/// Convenience method to thread this FieldInfo's reified type parameter to
143+
/// _FieldSet._ensureRepeatedField.
144+
List<T> _ensureRepeatedField(_FieldSet fs) {
145+
return fs._ensureRepeatedField<T>(this);
146+
}
147+
136148
String toString() => name;
137149
}

lib/src/protobuf/field_set.dart

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,18 @@ class _FieldSet {
127127
return value;
128128
}
129129

130+
List<T> _getDefaultList<T>(FieldInfo<T> fi) {
131+
assert(fi.isRepeated);
132+
if (_isReadOnly) return const [];
133+
134+
// TODO(skybrian) we could avoid this by generating another
135+
// method for repeated fields:
136+
// msg.mutableFoo().add(123);
137+
var value = fi._createRepeatedFieldWithType<T>(_message);
138+
_setNonExtensionFieldUnchecked(fi, value);
139+
return value;
140+
}
141+
130142
_getFieldOrNullByTag(int tagNumber) {
131143
var fi = _getFieldInfoOrNull(tagNumber);
132144
if (fi == null) return null;
@@ -256,6 +268,13 @@ class _FieldSet {
256268
return _getDefault(_nonExtensionInfoByIndex(index)) as T;
257269
}
258270

271+
/// The implementation of a generated getter for repeated fields.
272+
List<T> _$getList<T>(int index) {
273+
var value = _values[index];
274+
if (value != null) return value as List<T>;
275+
return _getDefaultList<T>(_nonExtensionInfoByIndex(index));
276+
}
277+
259278
/// The implementation of a generated getter for String fields.
260279
String _$getS(int index, String defaultValue) {
261280
var value = _values[index];
@@ -520,14 +539,14 @@ class _FieldSet {
520539
if (mustClone) {
521540
// fieldValue must be a PbList of GeneratedMessage.
522541
PbList<GeneratedMessage> pbList = fieldValue;
523-
// Copy the mapped values to a List to avoid redundant cloning (since
524-
// PbList.addAll iterates over its argument twice).
525-
_ensureRepeatedField(fi)
526-
.addAll(new List.from(pbList.map(_cloneMessage)));
542+
var repeatedFields = fi._ensureRepeatedField(this);
543+
for (int i = 0; i < pbList.length; ++i) {
544+
repeatedFields.add(_cloneMessage(pbList[i]));
545+
}
527546
} else {
528547
// fieldValue must be at least a PbList.
529548
PbList pbList = fieldValue;
530-
_ensureRepeatedField(fi).addAll(pbList);
549+
fi._ensureRepeatedField(this).addAll(pbList);
531550
}
532551
return;
533552
}

lib/src/protobuf/generated_message.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,9 @@ abstract class GeneratedMessage {
289289
/// For generated code only.
290290
T $_getN<T>(int index) => _fieldSet._$getN<T>(index);
291291

292+
/// For generated code only.
293+
List<T> $_getList<T>(int index) => _fieldSet._$getList<T>(index);
294+
292295
/// For generated code only.
293296
String $_getS(int index, String defaultValue) =>
294297
_fieldSet._$getS(index, defaultValue);

lib/src/protobuf/json.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ void _mergeFromJsonMap(
8787

8888
void _appendJsonList(
8989
_FieldSet fs, List jsonList, FieldInfo fi, ExtensionRegistry registry) {
90-
List repeated = fs._ensureRepeatedField(fi);
90+
var repeated = fi._ensureRepeatedField(fs);
9191
// Micro optimization. Using "for in" generates the following and iterator
9292
// alloc:
9393
// for (t1 = J.get$iterator$ax(json), t2 = fi.tagNumber, t3 = fi.type,

lib/src/protobuf/pb_list.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class PbList<E> extends ListBase<E> {
6565

6666
/// Reduces a collection to a single value by iteratively combining each
6767
/// element of the collection with an existing value.
68-
T fold<T>(T initialValue, T combine(dynamic previousValue, E element)) =>
68+
T fold<T>(T initialValue, T combine(T previousValue, E element)) =>
6969
_wrappedList.fold(initialValue, combine);
7070

7171
/// Checks whether every element of this iterable satisfies [test].

test/reserved_names_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
@TestOn("vm")
77
library reserved_names_test;
88

9-
import 'package:test/test.dart' show test, expect, equals, fail, TestOn;
9+
import 'package:test/test.dart';
1010

1111
import 'package:protobuf/meta.dart' show GeneratedMessage_reservedNames;
1212
import 'package:protobuf/mixins_meta.dart' show findMixin;
@@ -52,7 +52,8 @@ void main() {
5252
..addAll(findMemberNames("dart:collection", #MapMixin))
5353
..removeAll(GeneratedMessage_reservedNames);
5454

55-
expect(actual.toList()..sort(), equals(expected.toList()..sort()));
55+
expect(
56+
actual.toList()..sort(), containsAllInOrder(expected.toList()..sort()));
5657
});
5758

5859
test('PbEventMixin reserved names are up to date', () {

0 commit comments

Comments
 (0)