code: function replaceArguments(ast, nested) {
          if (!examine(ast).isFunction) 
              throw new Error("Can only replace 'arguments' in functions");
          if (!('$usesArguments' in ast)) {
              treeWalk(ast, function (node, descend, path) {
                  if (node.type === 'Identifier' && node.name === 'arguments') {
                      // Fix up shorthand properties
                      if (path[0].parent.shorthand) {
                          path[0].parent.shorthand = false;
                          path[0].parent.key = ident('arguments');
                          ast.$usesArguments = true;
                      }
                      // Replace identifiers that are not keys
                      if (path[0].field !== 'key' && path[0].field !== 'property') {
                          node.name = opts.$arguments;
                          ast.$usesArguments = true;
                      }
                  } else if (node === ast || !examine(node).isFunction) {
                      descend();
                  } else if (node.type === 'ArrowFunctionExpression') {
                      replaceArguments(node);
                      ast.$usesArguments = ast.$usesArguments || node.$usesArguments;
                  }
              });
              ast.$usesArguments = ast.$usesArguments || false;
          }
          return ast.$usesArguments && ast.type !== 'ArrowFunctionExpression';
      }
docs: /* Replace 'arguments' identifiers in a function. Return true if a
  replacement has been made and so the symbol opts.$arguments needs
  initializing.