@@ -187,6 +187,17 @@ class _FieldSet {
187187 return value;
188188 }
189189
190+ Map <K , V > _getDefaultMap <K , V >(MapFieldInfo <K , V > fi) {
191+ assert (fi.isMapField);
192+ if (_isReadOnly)
193+ return PbMap <K , V >.unmodifiable (PbMap <K , V >(fi.keyFieldType,
194+ fi.valueFieldType, fi.valueCreator, fi.valueOf, fi.enumValues));
195+
196+ var value = fi._createMapField (_message);
197+ _setNonExtensionFieldUnchecked (fi, value);
198+ return value;
199+ }
200+
190201 _getFieldOrNullByTag (int tagNumber) {
191202 var fi = _getFieldInfoOrNull (tagNumber);
192203 if (fi == null ) return null ;
@@ -292,6 +303,19 @@ class _FieldSet {
292303 return newValue;
293304 }
294305
306+ PbMap <K , V > _ensureMapField <K , V >(MapFieldInfo <K , V > fi) {
307+ assert (! _isReadOnly);
308+ assert (fi.isMapField);
309+ assert (fi.index != null ); // Map fields are not allowed to be extensions.
310+
311+ var value = _getFieldOrNull (fi);
312+ if (value != null ) return value as Map <K , V >;
313+
314+ var newValue = fi._createMapField (_message);
315+ _setNonExtensionFieldUnchecked (fi, newValue);
316+ return newValue;
317+ }
318+
295319 /// Sets a non-extended field and fires events.
296320 void _setNonExtensionFieldUnchecked (FieldInfo fi, value) {
297321 if (_hasObservers) {
@@ -324,6 +348,13 @@ class _FieldSet {
324348 return _getDefaultList <T >(_nonExtensionInfoByIndex (index));
325349 }
326350
351+ /// The implementation of a generated getter for map fields.
352+ Map <K , V > _$getMap <K , V >(int index) {
353+ var value = _values[index];
354+ if (value != null ) return value as Map <K , V >;
355+ return _getDefaultMap <K , V >(_nonExtensionInfoByIndex (index));
356+ }
357+
327358 /// The implementation of a generated getter for String fields.
328359 String _$getS (int index, String defaultValue) {
329360 var value = _values[index];
@@ -511,6 +542,8 @@ class _FieldSet {
511542 out.write ('$indent $key : {\n ' );
512543 value._fieldSet.writeString (out, '$indent ' );
513544 out.write ('$indent }\n ' );
545+ } else if (value is MapEntry ) {
546+ out.write ('$indent $key : {${value .key } : ${value .value }} \n ' );
514547 } else {
515548 out.write ('$indent $key : $value \n ' );
516549 }
@@ -527,6 +560,10 @@ class _FieldSet {
527560 for (var value in fieldValue) {
528561 renderValue (fi.name, value);
529562 }
563+ } else if (fieldValue is Map ) {
564+ for (var entry in fieldValue.entries) {
565+ renderValue (fi.name, entry);
566+ }
530567 } else {
531568 renderValue (fi.name, fieldValue);
532569 }
@@ -581,6 +618,20 @@ class _FieldSet {
581618
582619 bool mustClone = _isGroupOrMessage (otherFi.type);
583620
621+ if (fi.isMapField) {
622+ MapFieldInfo f = fi;
623+ mustClone = _isGroupOrMessage (f.valueFieldType);
624+ PbMap map = f._ensureMapField (this );
625+ if (mustClone) {
626+ for (MapEntry entry in fieldValue.entries) {
627+ map[entry.key] = _cloneMessage (entry.value);
628+ }
629+ } else {
630+ map.addAll (fieldValue);
631+ }
632+ return ;
633+ }
634+
584635 if (fi.isRepeated) {
585636 if (mustClone) {
586637 // fieldValue must be a PbListBase of GeneratedMessage.
0 commit comments