diff --git a/packages/babel-plugin-transform-es2015-classes/src/index.js b/packages/babel-plugin-transform-es2015-classes/src/index.js index 8089594177..fc68b461c5 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/index.js +++ b/packages/babel-plugin-transform-es2015-classes/src/index.js @@ -45,7 +45,7 @@ export default function ({ types: t }) { let Constructor = VanillaTransformer; if (state.opts.loose) Constructor = LooseTransformer; - path.replaceWith(new Constructor(path, state.file).run()); + path.replaceWith(new Constructor(path, state.file, state.opts).run()); if (path.isCallExpression() && path.get("callee").isArrowFunctionExpression()) { path.get("callee").arrowFunctionToExpression(); diff --git a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js index ce480f5516..50434e75f8 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js +++ b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js @@ -66,7 +66,7 @@ const findThisesVisitor = visitors.merge([noMethodVisitor, { }]); export default class ClassTransformer { - constructor(path: NodePath, file) { + constructor(path: NodePath, file, opts) { this.parent = path.parent; this.scope = path.scope; this.node = path.node; @@ -86,6 +86,7 @@ export default class ClassTransformer { this.pushedConstructor = false; this.pushedInherits = false; this.isLoose = false; + this.removeClassCallCheck = opts.removeClassCallCheck; this.superThises = []; @@ -129,12 +130,14 @@ export default class ClassTransformer { this.buildBody(); // make sure this class isn't directly called + if (!this.removeClassCallCheck) { constructorBody.body.unshift(t.expressionStatement(t.callExpression( file.addHelper("classCallCheck"), [ t.thisExpression(), this.classRef, ] ))); + } body = body.concat(this.staticPropBody.map((fn) => fn(this.classRef))); diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/class/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/class/actual.js new file mode 100644 index 0000000000..a869c28495 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/class/actual.js @@ -0,0 +1 @@ +class A {} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/class/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/class/expected.js new file mode 100644 index 0000000000..8311a6c3db --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/class/expected.js @@ -0,0 +1 @@ +let A = function A() {}; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/options.json b/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/options.json new file mode 100644 index 0000000000..822d9a5285 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + ["transform-es2015-classes", { + "removeClassCallCheck": true, + "loose": true + }] + ] +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/with-constructor/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/with-constructor/actual.js new file mode 100644 index 0000000000..9da66478b2 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/with-constructor/actual.js @@ -0,0 +1,11 @@ +class A { + constructor() { + console.log('a'); + } +} + +class B { + b() { + console.log('b'); + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/with-constructor/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/with-constructor/expected.js new file mode 100644 index 0000000000..e0e9ee4b85 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/with-constructor/expected.js @@ -0,0 +1,13 @@ +let A = function A() { + console.log('a'); +}; + +let B = function () { + function B() {} + + B.prototype.b = function b() { + console.log('b'); + }; + + return B; +}(); \ No newline at end of file