Fix handling of maps
diff --git a/protobuf/lib/src/protobuf/coded_buffer.dart b/protobuf/lib/src/protobuf/coded_buffer.dart
index e19404a..302b98c 100644
--- a/protobuf/lib/src/protobuf/coded_buffer.dart
+++ b/protobuf/lib/src/protobuf/coded_buffer.dart
@@ -208,28 +208,23 @@
._ensureMapField(meta, mapFieldInfo)
._mergeEntry(mapEntryMeta, input, registry);
break;
- }
- /*
- var fieldType = fi.type;
- fieldType &= ~(PbFieldType._PACKED_BIT | PbFieldType._REQUIRED_BIT);
- switch (fieldType) {
- case PbFieldType._OPTIONAL_GROUP:
- var subMessage = meta._makeEmptyMessage(tagNumber, registry);
- var oldValue = fs._getFieldOrNull(fi);
- if (oldValue != null) {
- subMessage.mergeFromMessage(oldValue);
+ case BaseFieldType.group:
+ if (fieldType.isRepeated) {
+ var subMessage = meta._makeEmptyMessage(tagNumber, registry);
+ input.readGroup(tagNumber, subMessage, registry);
+ fs._ensureRepeatedField(meta, fi).add(subMessage);
+ } else {
+ var subMessage = meta._makeEmptyMessage(tagNumber, registry);
+ var oldValue = fs._getFieldOrNull(fi);
+ if (oldValue != null) {
+ subMessage.mergeFromMessage(oldValue);
+ }
+ input.readGroup(tagNumber, subMessage, registry);
+ fs._setFieldUnchecked(meta, fi, subMessage);
}
- input.readGroup(tagNumber, subMessage, registry);
- fs._setFieldUnchecked(meta, fi, subMessage);
- break;
- case PbFieldType._REPEATED_GROUP:
- var subMessage = meta._makeEmptyMessage(tagNumber, registry);
- input.readGroup(tagNumber, subMessage, registry);
- fs._ensureRepeatedField(meta, fi).add(subMessage);
break;
}
- */
}
}
diff --git a/protobuf/lib/src/protobuf/field_type.dart b/protobuf/lib/src/protobuf/field_type.dart
index f5df8e4..2570835 100644
--- a/protobuf/lib/src/protobuf/field_type.dart
+++ b/protobuf/lib/src/protobuf/field_type.dart
@@ -62,6 +62,7 @@
sfixed64,
message,
map,
+ group,
}
/// Defines constants and functions for dealing with fieldType bits.
@@ -72,9 +73,18 @@
fieldType & ~(_REQUIRED_BIT | _REPEATED_BIT | _PACKED_BIT | _MAP_BIT);
static BaseFieldType toBaseType(int fieldType) {
- final baseType = _baseType(fieldType);
+ var baseType = fieldType & ~(_REQUIRED_BIT | _REPEATED_BIT | _PACKED_BIT);
+
+ // _MAP sets both message and map bits, probably because in some places we
+ // want to handle maps as messages, but in others we treat them specially..
+ // TODO: figure this out
+ if (baseType == _MAP) {
+ return BaseFieldType.map;
+ }
+
assert(baseType & (baseType - 1) == 0,
'base type has more than one bit set: $baseType');
+
switch (_baseType(fieldType)) {
case PbFieldType._BOOL_BIT:
return BaseFieldType.bool;
@@ -89,7 +99,7 @@
case PbFieldType._ENUM_BIT:
return BaseFieldType.enum_;
case PbFieldType._GROUP_BIT:
- throw ArgumentError('TODO: How to handle groups?');
+ return BaseFieldType.group;
case PbFieldType._INT32_BIT:
return BaseFieldType.int32;
case PbFieldType._INT64_BIT: