anchor.diff:        // TODO(paulberry): experiment to see if dynamic dispatch would be better,
         // so that the type hierarchy will be simpler (which may speed up "is"
         // checks).
  -      return expression._inferExpression(typeContext, typeNeeded);
  +      return expression._inferExpression(this, typeContext, typeNeeded);
       } else {
         // Encountered an expression type for which type inference is not yet
         // implemented, so just infer dynamic for now.
  
positive.code: abstract class KernelExpression implements Expression {
    /// Calls back to [inferrer] to perform type inference for whatever concrete
    /// type of [KernelExpression] this is.
    DartType _inferExpression(DartType typeContext, bool typeNeeded);
  }
  
  /// Concrete shadow object representing a function expression in kernel form.
  
negative.code:   KernelIntLiteral(int value) : super(value);
  
    @override
    DartType _inferExpression(
        KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
      // TODO(paulberry): implement.
      return typeNeeded ? const DynamicType() : null;
    }
  