diff --git a/src/babel/transformation/file/index.js b/src/babel/transformation/file/index.js index aa4cb57b79..75e844f61a 100644 --- a/src/babel/transformation/file/index.js +++ b/src/babel/transformation/file/index.js @@ -41,10 +41,11 @@ export default class File { this.dynamicImportIds = {}; this.dynamicImports = []; - this.usedHelpers = {}; - this.dynamicData = {}; - this.data = {}; - this.uids = {}; + this.declarations = {}; + this.usedHelpers = {}; + this.dynamicData = {}; + this.data = {}; + this.uids = {}; this.log = new Logger(this, opts.filename || "unknown"); this.opts = this.normalizeOptions(opts); @@ -395,8 +396,8 @@ export default class File { var program = this.ast.program; - var declar = program._declarations && program._declarations[name]; - if (declar) return declar.id; + var declar = this.declarations[name]; + if (declar) return declar; this.usedHelpers[name] = true; @@ -413,11 +414,11 @@ export default class File { var ref = util.template("helper-" + name); ref._compact = true; - var uid = this.scope.generateUidIdentifier(name); + var uid = this.declarations[name] = this.scope.generateUidIdentifier(name); this.scope.push({ - key: name, id: uid, - init: ref + init: ref, + unique: true }); return uid; } diff --git a/src/babel/transformation/transformers/es6/spec.symbols.js b/src/babel/transformation/transformers/es6/spec.symbols.js index 58cfe09f36..61dc672266 100644 --- a/src/babel/transformation/transformers/es6/spec.symbols.js +++ b/src/babel/transformation/transformers/es6/spec.symbols.js @@ -21,3 +21,7 @@ export function UnaryExpression(node, parent, scope, file) { } } } + +export function VariableDeclaration(node) { + if (node._generated) this.skip(); +} diff --git a/src/babel/transformation/transformers/index.js b/src/babel/transformation/transformers/index.js index 5d94722f50..1ec845d14a 100644 --- a/src/babel/transformation/transformers/index.js +++ b/src/babel/transformation/transformers/index.js @@ -94,8 +94,6 @@ export default { "spec.protoToAssign": require("./spec/proto-to-assign"), - _declarations: require("./internal/declarations"), - _shadowFunctions: require("./internal/shadow-functions"), "es7.doExpressions": require("./es7/do-expressions"), diff --git a/src/babel/transformation/transformers/internal/declarations.js b/src/babel/transformation/transformers/internal/declarations.js deleted file mode 100644 index c8977eeb22..0000000000 --- a/src/babel/transformation/transformers/internal/declarations.js +++ /dev/null @@ -1,37 +0,0 @@ -import * as strict from "../../helpers/strict"; -import * as t from "../../../types"; - -export var metadata = { - secondPass: true -}; - -export function BlockStatement(node, parent, scope, file) { - if (!node._declarations) return; - - strict.wrap(node, function () { - var kinds = {}; - var kind; - - for (var i in node._declarations) { - var declar = node._declarations[i]; - - kind = declar.kind || "var"; - var declarNode = t.variableDeclarator(declar.id, declar.init); - - if (declar.init) { - node.body.unshift(file.attachAuxiliaryComment(t.variableDeclaration(kind, [declarNode]))); - } else { - kinds[kind] ||= []; - kinds[kind].push(declarNode); - } - } - - for (kind in kinds) { - node.body.unshift(file.attachAuxiliaryComment(t.variableDeclaration(kind, kinds[kind]))); - } - - node._declarations = null; - }); -} - -export { BlockStatement as Program }; diff --git a/src/babel/traversal/index.js b/src/babel/traversal/index.js index ced192cb23..65112715d2 100644 --- a/src/babel/traversal/index.js +++ b/src/babel/traversal/index.js @@ -76,7 +76,7 @@ traverse.node = function (node, opts, scope, state, parentPath) { const CLEAR_KEYS = [ "trailingComments", "leadingComments", "extendedRange", - "_declarations", "_scopeInfo" ,"_paths", + "_scopeInfo" ,"_paths", "tokens", "range", "start", "end", "loc", "raw" ]; diff --git a/src/babel/traversal/scope.js b/src/babel/traversal/scope.js index f28592f337..a8e89724fa 100644 --- a/src/babel/traversal/scope.js +++ b/src/babel/traversal/scope.js @@ -516,23 +516,35 @@ export default class Scope { */ push(opts: Object) { - var block = this.block; + var path = this.path; - if (t.isLoop(block) || t.isCatchClause(block) || t.isFunction(block)) { - t.ensureBlock(block); - block = block.body; + if (path.isLoop() || path.isCatchClause() || path.isFunction()) { + t.ensureBlock(path.node); + path = path.get("body"); } - if (!t.isBlockStatement(block) && !t.isProgram(block)) { - block = this.getBlockParent().block; + if (!path.isBlockStatement() && !path.isProgram()) { + path = this.getBlockParent().path; } - block._declarations ||= {}; - block._declarations[opts.key || opts.id.name] = { - kind: opts.kind || "var", - id: opts.id, - init: opts.init - }; + var unique = opts.unique; + var kind = opts.kind || "var"; + + var dataKey = `declaration:${kind}`; + var declar = !unique && path.getData(dataKey); + + if (!declar) { + declar = t.variableDeclaration(opts.kind || "var", []); + declar._generated = true; + declar._blockHoist = 2; + + this.file.attachAuxiliaryComment(declar); + + path.get("body")[0]._containerInsertBefore([declar]); + if (!unique) path.setData(dataKey, declar); + } + + declar.declarations.push(t.variableDeclarator(opts.id, opts.init)); } /** diff --git a/src/babel/types/index.js b/src/babel/types/index.js index 1b7dbb75d2..312916c0fc 100644 --- a/src/babel/types/index.js +++ b/src/babel/types/index.js @@ -282,12 +282,11 @@ export function inheritsComments(child: Object, parent: Object): Object { export function inherits(child: Object, parent: Object): Object { if (!child || !parent) return child; - child._declarations = parent._declarations; - child._scopeInfo = parent._scopeInfo; - child.range = parent.range; - child.start = parent.start; - child.loc = parent.loc; - child.end = parent.end; + child._scopeInfo = parent._scopeInfo; + child.range = parent.range; + child.start = parent.start; + child.loc = parent.loc; + child.end = parent.end; child.typeAnnotation = parent.typeAnnotation; child.returnType = parent.returnType; diff --git a/test/core/fixtures/transformation/es6.modules-amd/exports-default/expected.js b/test/core/fixtures/transformation/es6.modules-amd/exports-default/expected.js index 3dfc0ccccd..68260cbd5b 100644 --- a/test/core/fixtures/transformation/es6.modules-amd/exports-default/expected.js +++ b/test/core/fixtures/transformation/es6.modules-amd/exports-default/expected.js @@ -29,4 +29,4 @@ define(["exports", "module"], function (exports, module) { module.exports = Foo; module.exports = foo; -}); +}); \ No newline at end of file diff --git a/test/core/fixtures/transformation/es6.modules-amd/exports-from/expected.js b/test/core/fixtures/transformation/es6.modules-amd/exports-from/expected.js index db5a7c3606..b20489db6f 100644 --- a/test/core/fixtures/transformation/es6.modules-amd/exports-from/expected.js +++ b/test/core/fixtures/transformation/es6.modules-amd/exports-from/expected.js @@ -1,14 +1,14 @@ define(["exports", "foo"], function (exports, _foo) { "use strict"; - var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }; - - var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }; - Object.defineProperty(exports, "__esModule", { value: true }); + var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }; + + var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }; + _defaults(exports, _interopRequireWildcard(_foo)); Object.defineProperty(exports, "foo", { diff --git a/test/core/fixtures/transformation/es6.modules-amd/exports-variable/expected.js b/test/core/fixtures/transformation/es6.modules-amd/exports-variable/expected.js index 9150d0f7c9..26a1aab376 100644 --- a/test/core/fixtures/transformation/es6.modules-amd/exports-variable/expected.js +++ b/test/core/fixtures/transformation/es6.modules-amd/exports-variable/expected.js @@ -1,11 +1,12 @@ define(["exports"], function (exports) { "use strict"; - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - Object.defineProperty(exports, "__esModule", { value: true }); + + var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; + exports.foo7 = foo7; var foo = 1; exports.foo = foo; @@ -31,4 +32,4 @@ define(["exports"], function (exports) { }; exports.foo8 = foo8; -}); +}); \ No newline at end of file diff --git a/test/core/fixtures/transformation/es6.modules-amd/overview/expected.js b/test/core/fixtures/transformation/es6.modules-amd/overview/expected.js index fd9a892fd3..4349443d83 100644 --- a/test/core/fixtures/transformation/es6.modules-amd/overview/expected.js +++ b/test/core/fixtures/transformation/es6.modules-amd/overview/expected.js @@ -1,12 +1,12 @@ define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (exports, _foo, _fooBar, _directoryFooBar) { "use strict"; - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - Object.defineProperty(exports, "__esModule", { value: true }); + var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; + var _foo2 = _interopRequire(_foo); exports.test = test; @@ -19,4 +19,4 @@ define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (exports, _foo; _foo.bar; _foo.foo; -}); +}); \ No newline at end of file diff --git a/test/core/fixtures/transformation/es6.modules-common/exports-default/expected.js b/test/core/fixtures/transformation/es6.modules-common/exports-default/expected.js index 483aa14736..1e0024e612 100644 --- a/test/core/fixtures/transformation/es6.modules-common/exports-default/expected.js +++ b/test/core/fixtures/transformation/es6.modules-common/exports-default/expected.js @@ -1,10 +1,11 @@ "use strict"; -var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - Object.defineProperty(exports, "__esModule", { value: true }); + +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; + exports["default"] = foo; exports["default"] = 42; exports["default"] = {}; diff --git a/test/core/fixtures/transformation/es6.modules-common/exports-from/expected.js b/test/core/fixtures/transformation/es6.modules-common/exports-from/expected.js index 9ab68d6c9d..0637083f05 100644 --- a/test/core/fixtures/transformation/es6.modules-common/exports-from/expected.js +++ b/test/core/fixtures/transformation/es6.modules-common/exports-from/expected.js @@ -1,13 +1,13 @@ "use strict"; -var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }; - -var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }; - Object.defineProperty(exports, "__esModule", { value: true }); +var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }; + +var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }; + var _foo = require("foo"); _defaults(exports, _interopRequireWildcard(_foo)); diff --git a/test/core/fixtures/transformation/es6.modules-common/exports-variable/expected.js b/test/core/fixtures/transformation/es6.modules-common/exports-variable/expected.js index ef2947462f..872031c988 100644 --- a/test/core/fixtures/transformation/es6.modules-common/exports-variable/expected.js +++ b/test/core/fixtures/transformation/es6.modules-common/exports-variable/expected.js @@ -1,10 +1,11 @@ "use strict"; -var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - Object.defineProperty(exports, "__esModule", { value: true }); + +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; + exports.foo7 = foo7; var foo = 1; exports.foo = foo; @@ -29,4 +30,4 @@ var foo8 = function foo8() { _classCallCheck(this, foo8); }; -exports.foo8 = foo8; +exports.foo8 = foo8; \ No newline at end of file diff --git a/test/core/fixtures/transformation/es6.modules-system/exports-default/expected.js b/test/core/fixtures/transformation/es6.modules-system/exports-default/expected.js index d9113b298e..e55e897b43 100644 --- a/test/core/fixtures/transformation/es6.modules-system/exports-default/expected.js +++ b/test/core/fixtures/transformation/es6.modules-system/exports-default/expected.js @@ -1,5 +1,7 @@ System.register([], function (_export) { - var _classCallCheck, _default, Foo; + var _default, Foo; + + var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; _export("default", foo); @@ -10,8 +12,6 @@ System.register([], function (_export) { execute: function () { "use strict"; - _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - _export("default", 42); _export("default", {}); @@ -39,4 +39,4 @@ System.register([], function (_export) { _export("default", Foo); } }; -}); +}); \ No newline at end of file diff --git a/test/core/fixtures/transformation/es6.modules-system/exports-variable/expected.js b/test/core/fixtures/transformation/es6.modules-system/exports-variable/expected.js index 5006e12bbf..6b0a9eb768 100644 --- a/test/core/fixtures/transformation/es6.modules-system/exports-variable/expected.js +++ b/test/core/fixtures/transformation/es6.modules-system/exports-variable/expected.js @@ -1,5 +1,7 @@ System.register([], function (_export) { - var _classCallCheck, foo, foo2, foo3, foo4, foo5, foo6, foo8; + var foo, foo2, foo3, foo4, foo5, foo6, foo8; + + var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; _export("foo7", foo7); @@ -10,8 +12,6 @@ System.register([], function (_export) { execute: function () { "use strict"; - _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - foo = 1; _export("foo", foo); @@ -43,4 +43,4 @@ System.register([], function (_export) { _export("foo3", foo3 = 5); } }; -}); +}); \ No newline at end of file diff --git a/test/core/fixtures/transformation/es6.modules-umd/exports-from/expected.js b/test/core/fixtures/transformation/es6.modules-umd/exports-from/expected.js index 85293a2999..3ba9443e48 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/exports-from/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/exports-from/expected.js @@ -13,14 +13,14 @@ })(this, function (exports, _foo) { "use strict"; - var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }; - - var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }; - Object.defineProperty(exports, "__esModule", { value: true }); + var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }; + + var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }; + _defaults(exports, _interopRequireWildcard(_foo)); Object.defineProperty(exports, "foo", { diff --git a/test/core/fixtures/transformation/es6.modules-umd/exports-variable/expected.js b/test/core/fixtures/transformation/es6.modules-umd/exports-variable/expected.js index c806e52afa..b9c310ceb2 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/exports-variable/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/exports-variable/expected.js @@ -13,11 +13,12 @@ })(this, function (exports) { "use strict"; - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - Object.defineProperty(exports, "__esModule", { value: true }); + + var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; + exports.foo7 = foo7; var foo = 1; exports.foo = foo; diff --git a/test/core/fixtures/transformation/es6.modules-umd/overview/expected.js b/test/core/fixtures/transformation/es6.modules-umd/overview/expected.js index 8000493eb7..59d94a1102 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/overview/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/overview/expected.js @@ -13,12 +13,12 @@ })(this, function (exports, _foo, _fooBar, _directoryFooBar) { "use strict"; - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - Object.defineProperty(exports, "__esModule", { value: true }); + var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; + var _foo2 = _interopRequire(_foo); exports.test = test; @@ -29,4 +29,4 @@ _foo.bar; _foo.foo; -}); +}); \ No newline at end of file diff --git a/test/core/fixtures/transformation/spec.proto-to-assign/assignment-expression/expected.js b/test/core/fixtures/transformation/spec.proto-to-assign/assignment-expression/expected.js index c562f1f1e7..8efad04c17 100644 --- a/test/core/fixtures/transformation/spec.proto-to-assign/assignment-expression/expected.js +++ b/test/core/fixtures/transformation/spec.proto-to-assign/assignment-expression/expected.js @@ -1,11 +1,11 @@ "use strict"; -var _foo, _foo$bar, _foo$bar2; - var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }; +var _foo, _foo$bar, _foo$bar2; + console.log((_foo = foo, _defaults(_foo, bar), _foo)); console.log((_foo$bar = foo[bar], _defaults(_foo$bar, bar), _foo$bar)); -console.log((_foo$bar2 = foo[bar()], _defaults(_foo$bar2, bar), _foo$bar2)); +console.log((_foo$bar2 = foo[bar()], _defaults(_foo$bar2, bar), _foo$bar2)); \ No newline at end of file