anchor.diff:  }
   
   // Mixes in the properties of [mixin] into [cls].
  -function mixin(cls, mixin) {
  -  mixinProperties(mixin.prototype, cls.prototype);
  +function mixinEasy(cls, mixin) {
  +  mixinPropertiesEasy(mixin.prototype, cls.prototype);
  +  cls.prototype.constructor = cls;
  +}
  +function mixinHard(cls, mixin) {
  +  mixinPropertiesHard(mixin.prototype, cls.prototype);
     cls.prototype.constructor = cls;
   }
   
  
positive.code:     to[key] = from[key];
    }
  }
  // Copies the own properties from [from] to [to] if not already present in [to].
  function mixinProperties(from, to) {
    var keys = Object.keys(from);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      if (!to.hasOwnProperty(key)) {
        to[key] = from[key];
      }
    }
  }
  
  
negative.code:     statements.addAll(inheritCalls);
      statements.addAll(mixinCalls);
      return wrapPhase('inheritance', statements);
    }
  
    /// Determines if the mixin methods can be applied to a mixin application
    /// class by a simple copy, or whether the class defines properties that would
    /// be clobbered by block-copying the mixin's properties, so a slower checking
    /// copy is needed.
    bool _hasSimpleMixin(Class cls) {
      List<Method> allMethods(Class cls) {
        return [
          ...cls.methods,
          ...cls.checkedSetters,
          ...cls.isChecks,
          ...cls.callStubs,
          ...cls.noSuchMethodStubs,
          ...cls.gettersSetters
        ];
      }
  
      final clsMethods = allMethods(cls);
      if (clsMethods.isEmpty) return true;
      // TODO(sra): Compare methods with those of `cls.mixinClass` to see if the
      // methods (and hence properties) will actually clash. If they are
      // non-overlapping, a simple copy might still be possible.
      return false;
    }
  
    /// Emits the setup of method aliases.
  