anchor.diff:    }
   
     /// The possible return types of a method that may be targeted by
  -  /// [typedSelector]. If the given selector is not a [TypedSelector], any
  -  /// reachable method matching the selector may be targeted.
  -  AbstractConstantValue getInvokeReturnType(Selector selector, TypeMask mask) {
  -    return fromMask(typeSystem.getInvokeReturnType(selector, mask));
  +  /// [selector] on [receiver].
  +  AbstractConstantValue getInvokeReturnType(
  +      Selector selector, AbstractConstantValue receiver) {
  +    return fromMask(typeSystem.getInvokeReturnType(selector, receiver.type));
     }
   
     AbstractConstantValue fromMask(TypeMask mask) {
  
positive.code: 
      if (node.selector.isCall) {
        if (node.selector == Selectors.codeUnitAt) {
          AbstractConstantValue object = getValue(node.dartReceiver);
          AbstractConstantValue right = getValue(node.dartArgument(0));
          AbstractConstantValue result = lattice.codeUnitAtSpecial(object, right);
          return finish(result, canReplace: !object.isNullable);
        }
        return finish(null);
      }
  
      if (node.selector == Selectors.index) {
        AbstractConstantValue object = getValue(node.dartReceiver);
        AbstractConstantValue right = getValue(node.dartArgument(0));
        AbstractConstantValue result = lattice.indexSpecial(object, right);
        return finish(result, canReplace: !object.isNullable);
      }
  
      if (!node.selector.isOperator) {
  
negative.code:     if (node.selector.isGetter) {
        // Constant fold known length of containers.
        if (node.selector == Selectors.length) {
          if (typeSystem.isDefinitelyIndexable(receiver.type, allowNull: true)) {
            AbstractConstantValue length = lattice.lengthSpecial(receiver);
            return finish(length, canReplace: !receiver.isNullable);
          }
        }
        return finish(null);
  