anchor.diff:  /// If the field is not found in the object, then it will visit the super
   /// object.
   DartObject getField(DartObject object, String field) {
  -  if (object == null || object.isNull) return null;
  +  if (_isNull(object)) return null;
     var fieldValue = object.getField(field);
     if (fieldValue != null && !fieldValue.isNull) {
       return fieldValue;
  
positive.code:   }
    return metadata;
  }
  
negative.code: List<DartObject> coerceList(DartObject value, String field) =>
      getField(value, field)?.toListValue() ?? const [];
  
  /*=T*/ coerceEnumValue/*<T>*/(DartObject object, String field,
      List<dynamic/*=T*/ > values, /*=T*/ defaultValue) {
    var enumField = getField(object, field);
    return _findEnumByFieldName(enumField, values) ??
        _findEnumByIndex(enumField, values, defaultValue);
  }
  
  /*=T*/ _findEnumByFieldName/*<T>*/(
          DartObject object, List<dynamic/*=T*/ > values) =>
      values.firstWhere(
          (field) => !_isNull(getField(object, '$field'.split('.')[1])),
          orElse: () => null);
  
  /*=T*/ _findEnumByIndex/*<T>*/(
      DartObject enumField, List<dynamic/*=T*/ > values, /*=T*/ defaultValue) {
    var index = getField(enumField, 'index');
    if (_isNull(index)) return defaultValue;
    var indexNum = index.toIntValue();
    return indexNum != null ? values[indexNum] : defaultValue;
  }
  