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: