From cdca54aed3d8644c5a4f75c3414890ae1c332d08 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 9 Jun 2017 18:12:12 -0400 Subject: [PATCH] remove possibleConstructorReturn in loose mode as well --- .../src/index.js | 2 +- .../src/vanilla.js | 49 ++++++++++++------- .../class/actual.js | 0 .../class/expected.js | 0 .../options.json | 1 - .../with-constructor/actual.js | 0 .../with-constructor/expected.js | 0 .../with-superClass/actual.js | 8 +++ .../with-superClass/expected.js | 18 +++++++ .../loose/accessing-super-class/expected.js | 8 ++- .../accessing-super-properties/expected.js | 4 +- .../calling-super-properties/expected.js | 4 +- .../loose/constructor-order/expected.js | 2 - .../fixtures/loose/literal-key/expected.js | 4 +- .../method-return-type-annotation/expected.js | 4 +- .../test/fixtures/loose/options.json | 8 ++- .../expected.js | 6 +-- .../fixtures/loose/super-class/expected.js | 3 +- .../loose/super-function-fallback/expected.js | 2 - .../fixtures/regression/T6755/expected.js | 6 +-- .../expected.js | 6 +-- .../expected.js | 6 +-- 22 files changed, 80 insertions(+), 61 deletions(-) rename packages/babel-plugin-transform-es2015-classes/test/fixtures/{removeClassCallCheck => loose-classCallCheck}/class/actual.js (100%) rename packages/babel-plugin-transform-es2015-classes/test/fixtures/{removeClassCallCheck => loose-classCallCheck}/class/expected.js (100%) rename packages/babel-plugin-transform-es2015-classes/test/fixtures/{removeClassCallCheck => loose-classCallCheck}/options.json (70%) rename packages/babel-plugin-transform-es2015-classes/test/fixtures/{removeClassCallCheck => loose-classCallCheck}/with-constructor/actual.js (100%) rename packages/babel-plugin-transform-es2015-classes/test/fixtures/{removeClassCallCheck => loose-classCallCheck}/with-constructor/expected.js (100%) create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-superClass/actual.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-superClass/expected.js diff --git a/packages/babel-plugin-transform-es2015-classes/src/index.js b/packages/babel-plugin-transform-es2015-classes/src/index.js index fc68b461c5..8089594177 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, state.opts).run()); + path.replaceWith(new Constructor(path, state.file).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 50434e75f8..2f1d98f444 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, opts) { + constructor(path: NodePath, file) { this.parent = path.parent; this.scope = path.scope; this.node = path.node; @@ -86,7 +86,6 @@ export default class ClassTransformer { this.pushedConstructor = false; this.pushedInherits = false; this.isLoose = false; - this.removeClassCallCheck = opts.removeClassCallCheck; this.superThises = []; @@ -129,14 +128,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, - ] - ))); + // make sure this class isn't directly called (with A() instead new A()) + if (!this.isLoose) { + constructorBody.body.unshift(t.expressionStatement(t.callExpression( + file.addHelper("classCallCheck"), [ + t.thisExpression(), + this.classRef, + ] + ))); } body = body.concat(this.staticPropBody.map((fn) => fn(this.classRef))); @@ -378,10 +377,16 @@ export default class ClassTransformer { ); } - let call = t.callExpression( - this.file.addHelper("possibleConstructorReturn"), - [t.thisExpression(), bareSuperNode] - ); + let call; + + if (this.isLoose) { + call = t.logicalExpression("||", bareSuperNode, t.thisExpression()); + } else { + call = t.callExpression( + this.file.addHelper("possibleConstructorReturn"), + [t.thisExpression(), bareSuperNode] + ); + } const bareSuperAfter = this.bareSuperAfter.map((fn) => fn(thisRef)); @@ -450,10 +455,18 @@ export default class ClassTransformer { thisPath.replaceWith(thisRef); } - const wrapReturn = (returnArg) => t.callExpression( - this.file.addHelper("possibleConstructorReturn"), - [thisRef].concat(returnArg || []) - ); + let wrapReturn; + + if (this.isLoose) { + wrapReturn = (returnArg) => { + return returnArg ? t.logicalExpression("||", returnArg, thisRef) : thisRef; + }; + } else { + wrapReturn = (returnArg) => t.callExpression( + this.file.addHelper("possibleConstructorReturn"), + [thisRef].concat(returnArg || []) + ); + } // if we have a return as the last node in the body then we've already caught that // return diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/class/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/class/actual.js similarity index 100% rename from packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/class/actual.js rename to packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/class/actual.js diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/class/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/class/expected.js similarity index 100% rename from packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/class/expected.js rename to packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/class/expected.js diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/options.json b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/options.json similarity index 70% rename from packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/options.json rename to packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/options.json index 822d9a5285..cad18de53d 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/options.json +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/options.json @@ -1,7 +1,6 @@ { "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/loose-classCallCheck/with-constructor/actual.js similarity index 100% rename from packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/with-constructor/actual.js rename to packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-constructor/actual.js 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/loose-classCallCheck/with-constructor/expected.js similarity index 100% rename from packages/babel-plugin-transform-es2015-classes/test/fixtures/removeClassCallCheck/with-constructor/expected.js rename to packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-constructor/expected.js diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-superClass/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-superClass/actual.js new file mode 100644 index 0000000000..76bb1ebddf --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-superClass/actual.js @@ -0,0 +1,8 @@ +class B {} + +class A extends B { + constructor(track) { + if (track !== undefined) super(track); + else super(); + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-superClass/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-superClass/expected.js new file mode 100644 index 0000000000..7c079574a6 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-superClass/expected.js @@ -0,0 +1,18 @@ +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +let B = function B() {}; + +let A = function (_B) { + _inherits(A, _B); + + function A(track) { + if (track !== undefined) { + var _this = _B.call(this, track) || this; + } else { + var _this = _B.call(this) || this; + } + return _this; + } + + return A; +}(B); \ No newline at end of file diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/accessing-super-class/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/accessing-super-class/expected.js index f837c9c172..9d90b4e72d 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/accessing-super-class/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/accessing-super-class/expected.js @@ -4,17 +4,15 @@ var Test = function (_Foo) { function Test() { var _Foo$prototype$test, _Foo$prototype$test2; - babelHelpers.classCallCheck(this, Test); - woops.super.test(); - var _this = babelHelpers.possibleConstructorReturn(this, _Foo.call(this)); + var _this = _Foo.call(this) || this; _Foo.prototype.test.call(_this); - var _this = babelHelpers.possibleConstructorReturn(this, _Foo.apply(this, arguments)); + var _this = _Foo.apply(this, arguments) || this; - var _this = babelHelpers.possibleConstructorReturn(this, _Foo.call.apply(_Foo, [this, "test"].concat(Array.prototype.slice.call(arguments)))); + var _this = _Foo.call.apply(_Foo, [this, "test"].concat(Array.prototype.slice.call(arguments))) || this; (_Foo$prototype$test = _Foo.prototype.test).call.apply(_Foo$prototype$test, [_this].concat(Array.prototype.slice.call(arguments))); (_Foo$prototype$test2 = _Foo.prototype.test).call.apply(_Foo$prototype$test2, [_this, "test"].concat(Array.prototype.slice.call(arguments))); diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/accessing-super-properties/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/accessing-super-properties/expected.js index b1da9bd99f..76b6773453 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/accessing-super-properties/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/accessing-super-properties/expected.js @@ -2,9 +2,7 @@ var Test = function (_Foo) { babelHelpers.inherits(Test, _Foo); function Test() { - babelHelpers.classCallCheck(this, Test); - - var _this = babelHelpers.possibleConstructorReturn(this, _Foo.call(this)); + var _this = _Foo.call(this) || this; _Foo.prototype.test; _Foo.prototype.test.whatever; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/calling-super-properties/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/calling-super-properties/expected.js index 25bdf6a1c3..a5e14ee06f 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/calling-super-properties/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/calling-super-properties/expected.js @@ -2,9 +2,7 @@ var Test = function (_Foo) { babelHelpers.inherits(Test, _Foo); function Test() { - babelHelpers.classCallCheck(this, Test); - - var _this = babelHelpers.possibleConstructorReturn(this, _Foo.call(this)); + var _this = _Foo.call(this) || this; _Foo.prototype.test.whatever(); _Foo.prototype.test.call(_this); diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/constructor-order/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/constructor-order/expected.js index 4ebd527994..be7df63f56 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/constructor-order/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/constructor-order/expected.js @@ -6,8 +6,6 @@ var x = function () { }; function x() { - babelHelpers.classCallCheck(this, x); - 4; 5; 6; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/literal-key/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/literal-key/expected.js index 9d78574423..126cb3ecde 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/literal-key/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/literal-key/expected.js @@ -1,7 +1,5 @@ var Foo = function () { - function Foo() { - babelHelpers.classCallCheck(this, Foo); - } + function Foo() {} Foo.prototype["bar"] = function bar() {}; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-return-type-annotation/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-return-type-annotation/expected.js index c426f3b6ac..513dccbcdf 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-return-type-annotation/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-return-type-annotation/expected.js @@ -1,8 +1,6 @@ // @flow var C = function () { - function C() { - babelHelpers.classCallCheck(this, C); - } + function C() {} C.prototype.m = function m(x: number): string { return 'a'; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/options.json b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/options.json index 5ba1a293bd..14e2e6ea02 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/options.json +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/options.json @@ -1,3 +1,9 @@ { - "plugins": ["external-helpers", "transform-es2015-function-name", ["transform-es2015-classes", { "loose": true }], "transform-es2015-spread", "transform-es2015-block-scoping"] + "plugins": [ + "external-helpers", + "transform-es2015-function-name", + ["transform-es2015-classes", { "loose": true }], + ["transform-es2015-spread", { "loose": true }], + "transform-es2015-block-scoping" + ] } diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-class-id-member-expression/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-class-id-member-expression/expected.js index e03b4f885c..5838f30e79 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-class-id-member-expression/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-class-id-member-expression/expected.js @@ -2,8 +2,7 @@ var BaseController = function (_Chaplin$Controller) { babelHelpers.inherits(BaseController, _Chaplin$Controller); function BaseController() { - babelHelpers.classCallCheck(this, BaseController); - return babelHelpers.possibleConstructorReturn(this, _Chaplin$Controller.apply(this, arguments)); + return _Chaplin$Controller.apply(this, arguments) || this; } return BaseController; @@ -13,8 +12,7 @@ var BaseController2 = function (_Chaplin$Controller$A) { babelHelpers.inherits(BaseController2, _Chaplin$Controller$A); function BaseController2() { - babelHelpers.classCallCheck(this, BaseController2); - return babelHelpers.possibleConstructorReturn(this, _Chaplin$Controller$A.apply(this, arguments)); + return _Chaplin$Controller$A.apply(this, arguments) || this; } return BaseController2; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-class/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-class/expected.js index dd6df765b8..bae3ab819e 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-class/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-class/expected.js @@ -2,8 +2,7 @@ var Test = function (_Foo) { babelHelpers.inherits(Test, _Foo); function Test() { - babelHelpers.classCallCheck(this, Test); - return babelHelpers.possibleConstructorReturn(this, _Foo.apply(this, arguments)); + return _Foo.apply(this, arguments) || this; } return Test; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-function-fallback/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-function-fallback/expected.js index 1f23d494a8..090bb67b1b 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-function-fallback/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/super-function-fallback/expected.js @@ -1,5 +1,3 @@ var Test = function Test() { - babelHelpers.classCallCheck(this, Test); - Function.prototype.hasOwnProperty.call(this, "test"); }; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T6755/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T6755/expected.js index 3a32ac177a..74bafa673b 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T6755/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T6755/expected.js @@ -1,11 +1,7 @@ "use strict"; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var Example = function () { - function Example() { - _classCallCheck(this, Example); - } + function Example() {} Example.prototype.test1 = async function test1() { await Promise.resolve(2); diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/transformed-class-method-loose-return-type-annotation/expected.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/transformed-class-method-loose-return-type-annotation/expected.js index 5df0023a18..8fd3bee001 100644 --- a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/transformed-class-method-loose-return-type-annotation/expected.js +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/transformed-class-method-loose-return-type-annotation/expected.js @@ -2,13 +2,11 @@ // @flow var C = function () { - function C() { - babelHelpers.classCallCheck(this, C); - } + function C() {} C.prototype.m = function m(x /*: number*/) /*: string*/ { return 'a'; }; return C; -}(); \ No newline at end of file +}(); diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/transformed-class-method-loose-return-type-annotation/expected.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/transformed-class-method-loose-return-type-annotation/expected.js index b12c969201..d3f42768b7 100644 --- a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/transformed-class-method-loose-return-type-annotation/expected.js +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/transformed-class-method-loose-return-type-annotation/expected.js @@ -1,13 +1,11 @@ "use strict"; var C = function () { - function C() { - babelHelpers.classCallCheck(this, C); - } + function C() {} C.prototype.m = function m(x) { return 'a'; }; return C; -}(); \ No newline at end of file +}();