function getFunctionParameters(node) {
  assert(node.type == 'FunctionExpression' ||
         node.type == 'ArrowFunctionExpression');
  // Example code: function(x, y, z = null, ...varArgs) {...}
  // Example node: {
  //   params: [
  //     { type: 'Identifier', name: 'x' },
  //     { type: 'Identifier', name: 'y' },
  //     {
  //       type: 'AssignmentPattern',
  //       left: { type: 'Identifier', name: 'z' },
  //       right: { type: 'Literal', raw: 'null' },
  //     },
  //     {
  //       type: 'RestElement',
  //       argument: { type: 'Identifier', name: 'varArgs' },
  //     },
  //   ],
  //   body: {...},
  // }
  return node.params.map((param) => {
    if (param.type == 'Identifier') {
      return param.name;
    } else if (param.type == 'AssignmentPattern') {
      return param.left.name;
    } else {
      assert.equal(param.type, 'RestElement');
      return '...' + param.argument.name;
    }
  });
}
@param {ASTNode} node A function definition node from the abstract syntax
  tree.
@return {!Array<string>} a list of the parameter names.