diff --git a/lib/6to5/transformation/templates/default-parameter.js b/lib/6to5/transformation/templates/default-parameter.js new file mode 100644 index 0000000000..74fecfd0f2 --- /dev/null +++ b/lib/6to5/transformation/templates/default-parameter.js @@ -0,0 +1 @@ +var VARIABLE_NAME = ARGUMENTS[ARGUMENT_KEY] === undefined ? DEFAULT_VALUE : ARGUMENTS[ARGUMENT_KEY]; diff --git a/lib/6to5/transformation/templates/if-undefined-set-to.js b/lib/6to5/transformation/templates/if-undefined-set-to.js deleted file mode 100644 index c5ed82cdf9..0000000000 --- a/lib/6to5/transformation/templates/if-undefined-set-to.js +++ /dev/null @@ -1 +0,0 @@ -if (VARIABLE === undefined) VARIABLE = DEFAULT; diff --git a/lib/6to5/transformation/transformers/es6-default-parameters.js b/lib/6to5/transformation/transformers/es6-default-parameters.js index 9715c2bbdc..ba3c0ad631 100644 --- a/lib/6to5/transformation/transformers/es6-default-parameters.js +++ b/lib/6to5/transformation/transformers/es6-default-parameters.js @@ -49,16 +49,29 @@ exports.Function = function (node, parent, file, scope) { var body = []; + var argsIdentifier = t.identifier("arguments"); + argsIdentifier._ignoreAliasFunctions = true; + + var lastNonDefaultParam = 0; + for (i in node.defaults) { def = node.defaults[i]; - if (!def) continue; + if (!def) { + lastNonDefaultParam = +i + 1; + continue; + } - body.push(util.template("if-undefined-set-to", { - VARIABLE: node.params[i], - DEFAULT: def + body.push(util.template("default-parameter", { + VARIABLE_NAME: node.params[i], + DEFAULT_VALUE: def, + ARGUMENT_KEY: t.literal(+i), + ARGUMENTS: argsIdentifier }, true)); } + // we need to cut off all trailing default parameters + node.params = node.params.slice(0, lastNonDefaultParam); + if (iife) { var container = t.functionExpression(null, [], node.body, node.generator); container._aliasFunction = true; diff --git a/test/fixtures/transformation/es6-arrow-functions/default-parameters/expected.js b/test/fixtures/transformation/es6-arrow-functions/default-parameters/expected.js index baba36b081..19d93a94d6 100644 --- a/test/fixtures/transformation/es6-arrow-functions/default-parameters/expected.js +++ b/test/fixtures/transformation/es6-arrow-functions/default-parameters/expected.js @@ -1,7 +1,7 @@ "use strict"; -var some = function (count) { - if (count === undefined) count = "30"; +var some = function () { + var count = arguments[0] === undefined ? "30" : arguments[0]; console.log("count", count); }; diff --git a/test/fixtures/transformation/es6-default-parameters/multiple/expected.js b/test/fixtures/transformation/es6-default-parameters/multiple/expected.js index 55bc52c5c9..af684c28f7 100644 --- a/test/fixtures/transformation/es6-default-parameters/multiple/expected.js +++ b/test/fixtures/transformation/es6-default-parameters/multiple/expected.js @@ -1,12 +1,12 @@ "use strict"; -var t = function (t, f) { - if (t === undefined) t = "foo"; - if (f === undefined) f = 5; +var t = function () { + var t = arguments[0] === undefined ? "foo" : arguments[0]; + var f = arguments[1] === undefined ? 5 : arguments[1]; return t + " bar " + f; }; -var a = function (t, f) { - if (f === undefined) f = 5; +var a = function (t) { + var f = arguments[1] === undefined ? 5 : arguments[1]; return t + " bar " + f; }; diff --git a/test/fixtures/transformation/es6-default-parameters/single/expected.js b/test/fixtures/transformation/es6-default-parameters/single/expected.js index 5021d6e0ab..f953c7a0a9 100644 --- a/test/fixtures/transformation/es6-default-parameters/single/expected.js +++ b/test/fixtures/transformation/es6-default-parameters/single/expected.js @@ -1,6 +1,6 @@ "use strict"; -var t = function (t) { - if (t === undefined) t = "foo"; +var t = function () { + var t = arguments[0] === undefined ? "foo" : arguments[0]; return t + " bar"; };