anchor.diff:  
     // Error-checking
   
  -  /// Checks the value for a field that's about to be set.
  +  /// Checks that the message is mutable (not frozen) and the value for the
  +  /// field is valid for the field type.
  +  ///
  +  /// Throws [UnsupportedError] if the message if immutable (frozen).
  +  ///
  +  /// Throws [ArgumentError] if the field value is not valid for the field
  +  /// type. For example, when setting a proto `string` field a Dart `int`.
     void _validateField(FieldInfo fi, var newValue) {
       _ensureWritable();
       var message = _getFieldError(fi.type, newValue);
  
positive.code:       }
      }
  
      if (isExtension!) {
        _ensureExtensions()
            ._setFieldAndInfo(fi as Extension<dynamic>, fieldValue);
      } else {
  
negative.code:     }
    }
  
    void _mergeField(FieldInfo otherFi, fieldValue, {required bool isExtension}) {
      final tagNumber = otherFi.tagNumber;
  
      // Determine the FieldInfo to use.
      // Don't allow regular fields to be overwritten by extensions.
      final meta = _meta;
      var fi = _nonExtensionInfo(meta, tagNumber);
      if (fi == null && isExtension) {
        // This will overwrite any existing extension field info.
        fi = otherFi;
      }
  
      if (fi!.isMapField) {
        if (fieldValue == null) {
          return;
        }
        final MapFieldInfo<dynamic, dynamic> f = fi as dynamic;
        final PbMap<dynamic, dynamic> map =
            f._ensureMapField(meta, this) as dynamic;
        if (_isGroupOrMessage(f.valueFieldType)) {
          PbMap fieldValueMap = fieldValue;
          for (final entry in fieldValueMap.entries) {
            map[entry.key] = (entry.value as GeneratedMessage).deepCopy();
  