From b3f2ea0aa1075df1a5782d5444e922c2c95167d2 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 18 Nov 2015 23:57:01 -0800 Subject: [PATCH] Avoid duplicating traversal of class declarations - fixes T2694 --- .../general/static-export/expected.js | 2 +- .../src/index.js | 17 ++++--- .../test/fixtures/regression/3028/actual.js | 16 +++++++ .../test/fixtures/regression/3028/expected.js | 45 +++++++++++++++++++ 4 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/actual.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/expected.js diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/general/static-export/expected.js b/packages/babel-plugin-transform-class-properties/test/fixtures/general/static-export/expected.js index 0405f67721..848dfbe5f6 100644 --- a/packages/babel-plugin-transform-class-properties/test/fixtures/general/static-export/expected.js +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/general/static-export/expected.js @@ -8,5 +8,5 @@ var MyClass2 = function MyClass2() { babelHelpers.classCallCheck(this, MyClass2); }; -export default MyClass2; MyClass2.property = value; +export default MyClass2; diff --git a/packages/babel-plugin-transform-es2015-classes/src/index.js b/packages/babel-plugin-transform-es2015-classes/src/index.js index bc7dff95eb..f922f99437 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/index.js +++ b/packages/babel-plugin-transform-es2015-classes/src/index.js @@ -8,16 +8,23 @@ export default function ({ types: t }) { return { visitor: { + ExportDefaultDeclaration(path){ + if (!path.get("declaration").isClassDeclaration()) return; + + let { node } = path; + let ref = node.declaration.id || path.scope.generateUidIdentifier("class"); + node.declaration.id = ref; + + // Split the class declaration and the export into two separate statements. + path.replaceWith(node.declaration); + path.insertAfter(t.exportDefaultDeclaration(ref)); + }, + ClassDeclaration(path) { let { node } = path; let ref = node.id || path.scope.generateUidIdentifier("class"); - if (path.parentPath.isExportDefaultDeclaration()) { - path = path.parentPath; - path.insertAfter(t.exportDefaultDeclaration(ref)); - } - path.replaceWith(t.variableDeclaration("let", [ t.variableDeclarator(ref, t.toExpression(node)) ])); diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/actual.js new file mode 100644 index 0000000000..2917b57938 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/actual.js @@ -0,0 +1,16 @@ +class b { +} + +class a1 extends b { + constructor() { + super(); + this.x = () => this; + } +} + +export default class a2 extends b { + constructor() { + super(); + this.x = () => this; + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/expected.js new file mode 100644 index 0000000000..8828aee19c --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/expected.js @@ -0,0 +1,45 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var b = function b() { + babelHelpers.classCallCheck(this, b); +}; + +var a1 = (function (_b) { + babelHelpers.inherits(a1, _b); + + function a1() { + babelHelpers.classCallCheck(this, a1); + + var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(a1).call(this)); + + _this.x = function () { + return _this; + }; + return _this; + } + + return a1; +})(b); + +var a2 = (function (_b2) { + babelHelpers.inherits(a2, _b2); + + function a2() { + babelHelpers.classCallCheck(this, a2); + + var _this2 = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(a2).call(this)); + + _this2.x = function () { + return _this2; + }; + return _this2; + } + + return a2; +})(b); + +exports.default = a2;