Skip to content

Commit c0fd4c1

Browse files
committed
merge es6.parameters.rest and es6.parameters.default transformers
This is necessary in order to retain correct function arity and to have completely correct semantics. Sometimes features are tied together so much that they would require so much desugaring to retain the correct semantics that they'd be equivalent to... the normal transpiled output.
1 parent 579e6fe commit c0fd4c1

39 files changed

Lines changed: 86 additions & 15 deletions

File tree

src/babel/transformation/transformers/deprecated.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@
88
"utility.inlineExpressions": "minification.constantFolding",
99
"utility.deadCodeElimination": "minification.deadCodeElimination",
1010
"utility.removeConsoleCalls": "minification.removeConsole",
11-
"utility.removeDebugger": "minification.removeDebugger"
11+
"utility.removeDebugger": "minification.removeDebugger",
12+
13+
"es6.parameters.rest": "es6.parameters",
14+
"es6.parameters.default": "es6.parameters"
1215
}

src/babel/transformation/transformers/es6/destructuring.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,15 @@ export var visitor = {
7070
let pattern = node.params[i];
7171
if (!t.isPattern(pattern)) continue;
7272

73-
var ref = node.params[i] = scope.generateUidIdentifier("ref");
73+
var ref = scope.generateUidIdentifier("ref");
74+
if (t.isAssignmentPattern(pattern)) {
75+
var _pattern = pattern;
76+
pattern = pattern.left;
77+
_pattern.left = ref;
78+
} else {
79+
node.params[i] = ref;
80+
}
81+
7482
t.inherits(ref, pattern);
7583

7684
var destructuring = new DestructuringTransformer({

src/babel/transformation/transformers/es6/parameters.default.js renamed to src/babel/transformation/transformers/es6/parameters/default.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import callDelegate from "../../helpers/call-delegate";
2-
import getFunctionArity from "../../helpers/get-function-arity";
3-
import * as util from "../../../util";
4-
import * as t from "../../../types";
1+
import callDelegate from "../../../helpers/call-delegate";
2+
import getFunctionArity from "../../../helpers/get-function-arity";
3+
import * as util from "../../../../util";
4+
import * as t from "../../../../types";
55

66
var hasDefaults = function (node) {
77
for (var i = 0; i < node.params.length; i++) {
@@ -38,7 +38,7 @@ export var visitor = {
3838

3939
//
4040
var argsIdentifier = t.identifier("arguments");
41-
argsIdentifier._shadowedFunctionLiteral = true;
41+
argsIdentifier._shadowedFunctionLiteral = node;
4242

4343
// push a default parameter definition
4444
function pushDefNode(left, right, i) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import * as util from "../../../../util";
2+
import * as visitors from "../../../../traversal/visitors";
3+
4+
import * as def from "./default";
5+
import * as rest from "./rest";
6+
7+
export var metadata = {
8+
group: "builtin-advanced"
9+
};
10+
11+
export var visitor = visitors.merge([rest.visitor, def.visitor]);

src/babel/transformation/transformers/es6/parameters.rest.js renamed to src/babel/transformation/transformers/es6/parameters/rest.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import * as util from "../../../util";
2-
import * as t from "../../../types";
1+
import * as util from "../../../../util";
2+
import * as t from "../../../../types";
33

44
var memberExpressionOptimisationVisitor = {
55
Scope(node, parent, scope, state) {
@@ -84,7 +84,7 @@ export var visitor = {
8484
var argsId = t.identifier("arguments");
8585

8686
// otherwise `arguments` will be remapped in arrow functions
87-
argsId._shadowedFunctionLiteral = true;
87+
argsId._shadowedFunctionLiteral = node;
8888

8989
// support patterns
9090
if (t.isPattern(rest)) {

src/babel/transformation/transformers/es6/spread.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ function build(props, scope) {
4343
return nodes;
4444
}
4545

46+
export var metadata = {
47+
group: "builtin-advanced"
48+
};
49+
4650
export var visitor = {
4751
ArrayExpression(node, parent, scope) {
4852
var elements = node.elements;

src/babel/transformation/transformers/es6/tail-call.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ class TailCallTransformer {
211211
var decl = t.variableDeclarator(this.argumentsId);
212212
if (this.argumentsId) {
213213
decl.init = t.identifier("arguments");
214-
decl.init._shadowedFunctionLiteral = true;
214+
decl.init._shadowedFunctionLiteral = node;
215215
}
216216
topVars.push(decl);
217217
}

src/babel/transformation/transformers/index.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,6 @@ export default {
4646
"es6.regex.sticky": require("./es6/regex.sticky"),
4747
"es6.regex.unicode": require("./es6/regex.unicode"),
4848
"es6.constants": require("./es6/constants"),
49-
"es6.parameters.rest": require("./es6/parameters.rest"),
50-
"es6.spread": require("./es6/spread"),
51-
"es6.parameters.default": require("./es6/parameters.default"),
5249
"es7.exportExtensions": require("./es7/export-extensions"),
5350
"spec.protoToAssign": require("babel-plugin-proto-to-assign"),
5451
"es7.doExpressions": require("./es7/do-expressions"),
@@ -57,6 +54,8 @@ export default {
5754
"spec.undefinedToVoid": require("babel-plugin-undefined-to-void"),
5855

5956
//- builtin-advanced
57+
"es6.spread": require("./es6/spread"),
58+
"es6.parameters": require("./es6/parameters"),
6059
"es6.destructuring": require("./es6/destructuring"),
6160
"es6.blockScoping": require("./es6/block-scoping"),
6261
"es6.spec.blockScoping": require("./es6/spec.block-scoping"),

src/babel/transformation/transformers/internal/shadow-functions.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ function remap(path, key, create) {
1010

1111
var fnPath = path.findParent((path) => !path.is("shadow") && (path.isFunction() || path.isProgram()));
1212

13+
var shadowed = path.node._shadowedFunctionLiteral;
14+
if (shadowed && shadowed !== fnPath.node) return;
15+
1316
var cached = fnPath.getData(key);
1417
if (cached) return cached;
1518

@@ -28,7 +31,7 @@ export var visitor = {
2831
},
2932

3033
ReferencedIdentifier(node) {
31-
if (node.name === "arguments" && !node._shadowedFunctionLiteral) {
34+
if (node.name === "arguments") {
3235
return remap(this, "arguments", () => t.identifier("arguments"));
3336
}
3437
}

src/babel/traversal/visitors.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ export function merge(visitors) {
126126
var rootVisitor = {};
127127

128128
for (var visitor of (visitors: Array)) {
129+
explode(visitor);
130+
129131
for (var type in visitor) {
130132
var nodeVisitor = rootVisitor[type] = rootVisitor[type] || {};
131133
mergePair(nodeVisitor, visitor[type]);

0 commit comments

Comments
 (0)