anchor.diff:    }
   
     JS.ArrowFun _emitArrowFunction(FunctionExpression node) {
  -    JS.Fun f = _emitFunctionBody(node.element, node.parameters, node.body);
  +    JS.Fun fn = _emitFunctionBody(node.element, node.parameters, node.body);
  +
  +    return annotate(_toArrowFunction(fn), node);
  +  }
  +
  +  JS.Fun _makeGenericFunction(JS.Fun fn) {
  +    if (fn.typeParams == null || fn.typeParams.isEmpty) return fn;
  +
  +    return new JS.Fun(
  +        fn.typeParams,
  +        new JS.Block([
  +          // Convert the function to an => function, to ensure `this` binding.
  +          new JS.Return(_toArrowFunction(fn))
  +        ]));
  +  }
  +
  +  JS.ArrowFun _toArrowFunction(JS.Fun f) {
       JS.Node body = f.body;
   
       // Simplify `=> { return e; }` to `=> e`
  
positive.code:   ///
    /// This is useful for indexed set methods, which otherwise would not have
    /// the right return value in JS.
    JS.Fun _alwaysReturnLastParameter(JS.Fun fn) {
      var body = fn.body;
      if (JS.Return.foundIn(fn)) {
        // If a return is inside body, transform `(params) { body }` to
        // `(params) { (() => { body })(); return value; }`.
        // TODO(jmesserly): we could instead generate the return differently,
        // and avoid the immediately invoked function.
        body = new JS.Call(new JS.ArrowFun([], fn.body), []).toStatement();
      }
      // Rewrite the function to include the return.
      return new JS.Fun(
          fn.params, new JS.Block([body, new JS.Return(fn.params.last)]),
          typeParams: fn.typeParams, returnType: fn.returnType)
        ..sourceInformation = fn.sourceInformation;
    }
  
    @override
  
negative.code:       fnBody = js.call('#._check(#)', [_emitType(method.returnType), fnBody]);
      }
  
      var fn = _makeGenericFunction(new JS.Fun(
          fnArgs, js.statement('{ return #; }', [fnBody]),
          typeParams: _emitTypeFormals(method.type.typeFormals)));
  
      // TODO(jmesserly): generic type arguments will get dropped.
      // We have a similar issue with `dgsend` helpers.
      return new JS.Method(
          _declareMemberName(method,
              useExtension: _extensionTypes.isNativeClass(type.element)),
          fn,
          isGetter: method is PropertyAccessorElement && method.isGetter,
          isSetter: method is PropertyAccessorElement && method.isSetter,
          isStatic: false);
  