code: function asyncDefineMethod(ast) {
          return treeWalk(ast, function (node, descend, path) {
              var transform = getMemberFunction(node);
              descend();
              if (!transform || !examine(transform).isAsync) 
                  return;
              if (node.kind == 'set') {
                  var ex = new SyntaxError(where(transform) + "method 'async set' cannot be invoked", pr.filename, node.start);
                  ex.pos = node.start;
                  ex.loc = node.loc.start;
                  throw ex;
              }
              transform.async = false;
              var usesArgs = replaceArguments(transform);
              if (!containsAsyncExit(transform) && (transform.body.body.length === 0 || transform.body.body[transform.body.body.length - 1].type !== 'ReturnStatement')) {
                  transform.body.body.push({
                      type: 'ReturnStatement'
                  });
              }
              var funcback = bindAsync(setExit({
                  type: 'FunctionExpression',
                  params: [genIdent.return,genIdent.error],
                  body: asyncDefineMethod(mapReturns(transform.body, path)),
                  $wasAsync: true
              }, opts), opts.promises || opts.generators || opts.engine ? null : literal(opts.lazyThenables ? 0 : true));
              if (opts.promises) {
                  transform.body = {
                      type: 'BlockStatement',
                      body: [{
                          type: 'ReturnStatement',
                          argument: {
                              type: 'NewExpression',
                              callee: genIdent.Promise,
                              arguments: [funcback]
                          }
                      }]
                  };
              } else {
                  transform.body = {
                      type: 'BlockStatement',
                      body: [{
                          type: 'ReturnStatement',
                          argument: funcback
                      }]
                  };
              }
              if (usesArgs) {
                  afterDirectives(transform.body.body, [assign$Args]);
              }
          });
      }
docs: TODO: Hoist directives (as in asyncDefine)