Skip to content

Commit 34f3347

Browse files
Sync changes from internal repo. (#79)
* Added enumValues to FieldInfo. Fixes #63. * Small performance optimization when deserializing repeated messages from JSON. * Type annotations for strong mode.
1 parent 03f0bb3 commit 34f3347

File tree

7 files changed

+73
-40
lines changed

7 files changed

+73
-40
lines changed

CHANGELOG.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
## 0.5.6
1+
## 0.6.0
22

3-
* Add generic type to `CheckFunc` typedef.
3+
* Added enumValues to FieldInfo. Fixes #63.
4+
* Small performance optimization when deserializing repeated messages
5+
from JSON.
6+
* Type annotations for strong mode.
47

58
## 0.5.5
69

lib/src/protobuf/builder_info.dart

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,30 @@ class BuilderInfo {
1616

1717
BuilderInfo(this.messageName);
1818

19-
void add<T>(int tagNumber, String name, int fieldType, dynamic defaultOrMaker,
20-
CreateBuilderFunc subBuilder, ValueOfFunc valueOf) {
19+
void add<T>(
20+
int tagNumber,
21+
String name,
22+
int fieldType,
23+
dynamic defaultOrMaker,
24+
CreateBuilderFunc subBuilder,
25+
ValueOfFunc valueOf,
26+
List<ProtobufEnum> enumValues) {
2127
var index = fieldInfo.length;
2228
addField(new FieldInfo<T>(name, tagNumber, index, fieldType, defaultOrMaker,
23-
subBuilder, valueOf));
29+
subBuilder, valueOf, enumValues));
2430
}
2531

26-
void addRepeated<T>(int tagNumber, String name, int fieldType,
27-
CheckFunc<T> check, CreateBuilderFunc subBuilder, ValueOfFunc valueOf) {
32+
void addRepeated<T>(
33+
int tagNumber,
34+
String name,
35+
int fieldType,
36+
CheckFunc<T> check,
37+
CreateBuilderFunc subBuilder,
38+
ValueOfFunc valueOf,
39+
List<ProtobufEnum> enumValues) {
2840
var index = fieldInfo.length;
29-
addField(new FieldInfo<T>.repeated(
30-
name, tagNumber, index, fieldType, check, subBuilder, valueOf));
41+
addField(new FieldInfo<T>.repeated(name, tagNumber, index, fieldType, check,
42+
subBuilder, valueOf, enumValues));
3143
}
3244

3345
void addField(FieldInfo fi) {
@@ -39,36 +51,42 @@ class BuilderInfo {
3951
void a<T>(int tagNumber, String name, int fieldType,
4052
[dynamic defaultOrMaker,
4153
CreateBuilderFunc subBuilder,
42-
ValueOfFunc valueOf]) {
43-
add<T>(tagNumber, name, fieldType, defaultOrMaker, subBuilder, valueOf);
54+
ValueOfFunc valueOf,
55+
List<ProtobufEnum> enumValues]) {
56+
add<T>(tagNumber, name, fieldType, defaultOrMaker, subBuilder, valueOf,
57+
enumValues);
4458
}
4559

4660
// Enum.
4761
void e<T>(int tagNumber, String name, int fieldType, dynamic defaultOrMaker,
48-
ValueOfFunc valueOf) {
49-
add<T>(tagNumber, name, fieldType, defaultOrMaker, null, valueOf);
62+
ValueOfFunc valueOf, List<ProtobufEnum> enumValues) {
63+
add<T>(
64+
tagNumber, name, fieldType, defaultOrMaker, null, valueOf, enumValues);
5065
}
5166

5267
// Repeated message.
5368
// TODO(skybrian): migrate to pp() and remove.
5469
void m<T>(int tagNumber, String name, CreateBuilderFunc subBuilder,
5570
MakeDefaultFunc makeDefault) {
5671
add<T>(tagNumber, name, PbFieldType._REPEATED_MESSAGE, makeDefault,
57-
subBuilder, null);
72+
subBuilder, null, null);
5873
}
5974

6075
// Repeated, not a message, group, or enum.
6176
void p<T>(int tagNumber, String name, int fieldType) {
6277
assert(!_isGroupOrMessage(fieldType) && !_isEnum(fieldType));
63-
addRepeated<T>(
64-
tagNumber, name, fieldType, getCheckFunction(fieldType), null, null);
78+
addRepeated<T>(tagNumber, name, fieldType, getCheckFunction(fieldType),
79+
null, null, null);
6580
}
6681

6782
// Repeated message, group, or enum.
6883
void pp<T>(int tagNumber, String name, int fieldType, CheckFunc<T> check,
69-
[CreateBuilderFunc subBuilder, ValueOfFunc valueOf]) {
84+
[CreateBuilderFunc subBuilder,
85+
ValueOfFunc valueOf,
86+
List<ProtobufEnum> enumValues]) {
7087
assert(_isGroupOrMessage(fieldType) || _isEnum(fieldType));
71-
addRepeated<T>(tagNumber, name, fieldType, check, subBuilder, valueOf);
88+
addRepeated<T>(
89+
tagNumber, name, fieldType, check, subBuilder, valueOf, enumValues);
7290
}
7391

7492
bool containsTagNumber(int tagNumber) => fieldInfo.containsKey(tagNumber);

lib/src/protobuf/extension.dart

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,18 @@ class Extension<T> extends FieldInfo<T> {
1111
Extension(this.extendee, String name, int tagNumber, int fieldType,
1212
[dynamic defaultOrMaker,
1313
CreateBuilderFunc subBuilder,
14-
ValueOfFunc valueOf])
14+
ValueOfFunc valueOf,
15+
List<ProtobufEnum> enumValues])
1516
: super(name, tagNumber, null, fieldType, defaultOrMaker, subBuilder,
16-
valueOf);
17+
valueOf, enumValues);
1718

1819
Extension.repeated(this.extendee, String name, int tagNumber, int fieldType,
19-
CheckFunc<T> check, [CreateBuilderFunc subBuilder, ValueOfFunc valueOf])
20-
: super.repeated(
21-
name, tagNumber, null, fieldType, check, subBuilder, valueOf);
20+
CheckFunc<T> check,
21+
[CreateBuilderFunc subBuilder,
22+
ValueOfFunc valueOf,
23+
List<ProtobufEnum> enumValues])
24+
: super.repeated(name, tagNumber, null, fieldType, check, subBuilder,
25+
valueOf, enumValues);
2226

2327
int get hashCode => extendee.hashCode * 31 + tagNumber;
2428

lib/src/protobuf/field_error.dart

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -118,58 +118,58 @@ CheckFunc getCheckFunction(int fieldType) {
118118

119119
// check functions for repeated fields
120120

121-
void _checkNotNull(val) {
121+
void _checkNotNull(Object val) {
122122
if (val == null) {
123123
throw new ArgumentError("Can't add a null to a repeated field");
124124
}
125125
}
126126

127-
void _checkBool(bool val) {
127+
void _checkBool(Object val) {
128128
if (val is! bool) throw _createFieldTypeError(val, 'a bool');
129129
}
130130

131-
void _checkBytes(List<int> val) {
131+
void _checkBytes(Object val) {
132132
if (val is! List<int>) throw _createFieldTypeError(val, 'a List<int>');
133133
}
134134

135-
void _checkString(String val) {
135+
void _checkString(Object val) {
136136
if (val is! String) throw _createFieldTypeError(val, 'a String');
137137
}
138138

139-
void _checkFloat(double val) {
139+
void _checkFloat(Object val) {
140140
_checkDouble(val);
141141
if (!_isFloat32(val)) throw _createFieldRangeError(val, 'a float');
142142
}
143143

144-
void _checkDouble(double val) {
144+
void _checkDouble(Object val) {
145145
if (val is! double) throw _createFieldTypeError(val, 'a double');
146146
}
147147

148-
void _checkInt(int val) {
148+
void _checkInt(Object val) {
149149
if (val is! int) throw _createFieldTypeError(val, 'an int');
150150
}
151151

152-
void _checkSigned32(int val) {
152+
void _checkSigned32(Object val) {
153153
_checkInt(val);
154154
if (!_isSigned32(val)) throw _createFieldRangeError(val, 'a signed int32');
155155
}
156156

157-
void _checkUnsigned32(int val) {
157+
void _checkUnsigned32(Object val) {
158158
_checkInt(val);
159159
if (!_isUnsigned32(val)) {
160160
throw _createFieldRangeError(val, 'an unsigned int32');
161161
}
162162
}
163163

164-
void _checkAnyInt64(Int64 val) {
164+
void _checkAnyInt64(Object val) {
165165
if (val is! Int64) throw _createFieldTypeError(val, 'an Int64');
166166
}
167167

168-
void _checkAnyEnum(ProtobufEnum val) {
168+
void _checkAnyEnum(Object val) {
169169
if (val is! ProtobufEnum) throw _createFieldTypeError(val, 'a ProtobufEnum');
170170
}
171171

172-
void _checkAnyMessage(GeneratedMessage val) {
172+
void _checkAnyMessage(Object val) {
173173
if (val is! GeneratedMessage) {
174174
throw _createFieldTypeError(val, 'a GeneratedMessage');
175175
}

lib/src/protobuf/field_info.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ class FieldInfo<T> {
2020
// see GeneratedMessage._getEmptyMessage
2121
final CreateBuilderFunc subBuilder;
2222

23+
// List of all enum enumValues.
24+
// (Not used for other types.)
25+
final List<ProtobufEnum> enumValues;
26+
2327
// Looks up the enum value given its integer code.
2428
// (Not used for other types.)
2529
// see GeneratedMessage._getValueOfFunc
@@ -30,7 +34,7 @@ class FieldInfo<T> {
3034
final CheckFunc<T> check;
3135

3236
FieldInfo(this.name, this.tagNumber, this.index, int type,
33-
[dynamic defaultOrMaker, this.subBuilder, this.valueOf])
37+
[dynamic defaultOrMaker, this.subBuilder, this.valueOf, this.enumValues])
3438
: this.type = type,
3539
this.makeDefault = findMakeDefault(type, defaultOrMaker),
3640
this.check = null {
@@ -41,7 +45,7 @@ class FieldInfo<T> {
4145

4246
FieldInfo.repeated(this.name, this.tagNumber, this.index, int type,
4347
this.check, this.subBuilder,
44-
[this.valueOf])
48+
[this.valueOf, this.enumValues])
4549
: this.type = type,
4650
this.makeDefault = (() => new PbList<T>(check: check)) {
4751
assert(name != null);
@@ -59,6 +63,8 @@ class FieldInfo<T> {
5963

6064
bool get isRequired => _isRequired(type);
6165
bool get isRepeated => _isRepeated(type);
66+
bool get isGroupOrMessage => _isGroupOrMessage(type);
67+
bool get isEnum => _isEnum(type);
6268

6369
/// Returns a read-only default value for a field.
6470
/// (Unlike getField, doesn't create a repeated field.)
@@ -79,7 +85,7 @@ class FieldInfo<T> {
7985
return message._fieldSet._hasRequiredValues();
8086
}
8187

82-
List list = value;
88+
List<GeneratedMessage> list = value;
8389
if (list.isEmpty) return true;
8490

8591
// For message types that (recursively) contain no required fields,

lib/src/protobuf/json.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ void _mergeFromJsonMap(
8585
void _appendJsonList(
8686
_FieldSet fs, List json, FieldInfo fi, ExtensionRegistry registry) {
8787
List repeated = fs._ensureRepeatedField(fi);
88-
for (var value in json) {
88+
var length = json.length;
89+
for (int i = 0; i < length; ++i) {
90+
var value = json[i];
8991
var convertedValue =
9092
_convertJsonValue(fs, value, fi.tagNumber, fi.type, registry);
9193
if (convertedValue != null) {

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: protobuf
2-
version: 0.5.6-dev
2+
version: 0.6.0
33
author: Dart Team <[email protected]>
44
description: Runtime library for protocol buffers support.
55
homepage: https://github.com/dart-lang/protobuf

0 commit comments

Comments
 (0)