es6-default-params
Version:
Function default parameters compiled to ES5.
69 lines (61 loc) • 1.78 kB
JavaScript
var recast = require('recast');
var types = recast.types;
var n = types.namedTypes;
var b = types.builders;
/**
* Visits an AST looking default params. This is intended to be used with the
* ast-types `visit()` function.
*
* @private
*/
function Visitor() {
types.PathVisitor.call(this);
}
Visitor.prototype = Object.create(types.PathVisitor.prototype);
Visitor.prototype.constructor = Visitor;
/**
* Visits functions looking for default params, replacing them with assignment
* expressions as appropriate.
*
* @param {Path} path
*/
Visitor.prototype.visitFunction = function(path) {
var node = path.node;
var defaults = node.defaults;
var params = node.params;
var assignments = [];
if (defaults && defaults.length > 0) {
defaults.forEach(function (defaultExpression, i) {
if (defaultExpression) {
var param = params[i];
var argumentExpression = b.memberExpression(
b.identifier('arguments'),
b.literal(i),
true
);
// var a = (arguments[0] !== void 0 ? arguments[0] : someDefault);
assignments.push(b.variableDeclaration(
'var',
[b.variableDeclarator(
param,
b.conditionalExpression(
b.binaryExpression(
'!==',
argumentExpression,
b.unaryExpression('void', b.literal(0))
),
argumentExpression,
defaultExpression
)
)]
));
}
});
node.params = node.params.slice(0, node.params.length - assignments.length);
node.defaults = [];
node.body.body.unshift.apply(node.body.body, assignments);
}
this.traverse(path);
};
Visitor.visitor = new Visitor();
module.exports = Visitor;