diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index da1437fa80..a034093a0d 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -106,6 +106,7 @@ export default class ReplaceSupers { this.isStatic = opts.isStatic; this.hasSuper = false; this.inClass = inClass; + this.inConstructor = opts.inConstructor; this.isLoose = opts.isLoose; this.scope = this.methodPath.scope; this.file = opts.file; @@ -123,6 +124,7 @@ export default class ReplaceSupers { isStatic: boolean; hasSuper: boolean; inClass: boolean; + inConstructor: boolean; isLoose: boolean; scope: Scope; file; @@ -132,6 +134,7 @@ export default class ReplaceSupers { methodPath: NodePath, methodNode: Object, superRef: Object, + inConstructor: boolean, isStatic: boolean, isLoose: boolean, file: any, @@ -174,10 +177,18 @@ export default class ReplaceSupers { */ getSuperProperty(property: Object, isComputed: boolean): Object { + let thisExpr = t.thisExpression(); + if (this.inConstructor) { + thisExpr = t.callExpression( + this.file.addHelper("assertThisInitialized"), + [thisExpr], + ); + } + return t.callExpression(this.file.addHelper("get"), [ getPrototypeOfExpression(this.getObjectRef(), this.isStatic), isComputed ? property : t.stringLiteral(property.name), - t.thisExpression(), + thisExpr, ]); } diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 1349696a22..2ac4251c02 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -509,12 +509,24 @@ helpers.objectWithoutProperties = defineHelper(` } `); +helpers.assertThisInitialized = defineHelper(` + export default function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } +`); + helpers.possibleConstructorReturn = defineHelper(` export default function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } - if (!self) { + // TODO: Should just be + // import assertThisInitialized from "assertThisInitialized"; + // return assertThisInitialized(self); + if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/general/derived/expected.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/general/derived/expected.js index 6a729c8c02..5615c3cffb 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/general/derived/expected.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/general/derived/expected.js @@ -7,7 +7,7 @@ function (_Bar) { var _temp, _this; babelHelpers.classCallCheck(this, Foo); - return babelHelpers.possibleConstructorReturn(_this, (_temp = _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this, ...args)), Object.defineProperty(_this, "bar", { + return babelHelpers.possibleConstructorReturn(_this, (_temp = _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this, ...args)), Object.defineProperty(babelHelpers.assertThisInitialized(_this), "bar", { configurable: true, enumerable: true, writable: true, diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/general/foobar/expected.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/general/foobar/expected.js index 2865c35414..4c8e9df931 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/general/foobar/expected.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/general/foobar/expected.js @@ -8,7 +8,7 @@ function (_Parent) { babelHelpers.classCallCheck(this, Child); _this = babelHelpers.possibleConstructorReturn(this, (Child.__proto__ || Object.getPrototypeOf(Child)).call(this)); - Object.defineProperty(_this, "scopedFunctionWithThis", { + Object.defineProperty(babelHelpers.assertThisInitialized(_this), "scopedFunctionWithThis", { configurable: true, enumerable: true, writable: true, diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-call/expected.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-call/expected.js index 4806970bce..edd181b05b 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-call/expected.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-call/expected.js @@ -23,11 +23,11 @@ function (_A) { var _temp, _this; babelHelpers.classCallCheck(this, B); - return babelHelpers.possibleConstructorReturn(_this, (_temp = _this = babelHelpers.possibleConstructorReturn(this, (B.__proto__ || Object.getPrototypeOf(B)).call(this, ...args)), Object.defineProperty(_this, "foo", { + return babelHelpers.possibleConstructorReturn(_this, (_temp = _this = babelHelpers.possibleConstructorReturn(this, (B.__proto__ || Object.getPrototypeOf(B)).call(this, ...args)), Object.defineProperty(babelHelpers.assertThisInitialized(_this), "foo", { configurable: true, enumerable: true, writable: true, - value: babelHelpers.get(B.prototype.__proto__ || Object.getPrototypeOf(B.prototype), "foo", _this).call(_this) + value: babelHelpers.get(B.prototype.__proto__ || Object.getPrototypeOf(B.prototype), "foo", babelHelpers.assertThisInitialized(_this)).call(_this) }), _temp)); } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-expression/expected.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-expression/expected.js index 1c370a24b3..aaa16b44ee 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-expression/expected.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-expression/expected.js @@ -7,7 +7,7 @@ function (_Bar) { var _temp, _this; babelHelpers.classCallCheck(this, Foo); - foo((_temp = _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)), Object.defineProperty(_this, "bar", { + foo((_temp = _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)), Object.defineProperty(babelHelpers.assertThisInitialized(_this), "bar", { configurable: true, enumerable: true, writable: true, diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-statement/expected.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-statement/expected.js index b741a00fe2..5c9c26143b 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-statement/expected.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/general/super-statement/expected.js @@ -8,7 +8,7 @@ function (_Bar) { babelHelpers.classCallCheck(this, Foo); _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); - Object.defineProperty(_this, "bar", { + Object.defineProperty(babelHelpers.assertThisInitialized(_this), "bar", { configurable: true, enumerable: true, writable: true, diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/regression/6154/expected.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/regression/6154/expected.js index c027b23cbc..c272ca164b 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/regression/6154/expected.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/regression/6154/expected.js @@ -2,7 +2,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat function _instanceof(left, right) { if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { return right[Symbol.hasInstance](left); } else { return left instanceof right; } } -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } 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; } @@ -10,6 +10,8 @@ function _classCallCheck(instance, Constructor) { if (!_instanceof(instance, Con function _get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return _get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + var Test = function Test() { var _this2 = this; @@ -31,12 +33,12 @@ var Test = function Test() { args[_key] = arguments[_key]; } - return _possibleConstructorReturn(_this, (_temp = _this = _possibleConstructorReturn(this, (_ref = Other.__proto__ || Object.getPrototypeOf(Other)).call.apply(_ref, [this].concat(args))), Object.defineProperty(_this, "a", { + return _possibleConstructorReturn(_this, (_temp = _this = _possibleConstructorReturn(this, (_ref = Other.__proto__ || Object.getPrototypeOf(Other)).call.apply(_ref, [this].concat(args))), Object.defineProperty(_assertThisInitialized(_this), "a", { configurable: true, enumerable: true, writable: true, value: function value() { - return _get(Other.prototype.__proto__ || Object.getPrototypeOf(Other.prototype), "test", _this); + return _get(Other.prototype.__proto__ || Object.getPrototypeOf(Other.prototype), "test", _assertThisInitialized(_this)); } }), _temp)); } @@ -49,7 +51,7 @@ var Test = function Test() { enumerable: true, writable: true, value: function value() { - return _get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this2); + return _get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _assertThisInitialized(_this2)); } }); }; diff --git a/packages/babel-plugin-transform-classes/src/vanilla.js b/packages/babel-plugin-transform-classes/src/vanilla.js index 027ee8d287..8064a37511 100644 --- a/packages/babel-plugin-transform-classes/src/vanilla.js +++ b/packages/babel-plugin-transform-classes/src/vanilla.js @@ -17,22 +17,6 @@ const noMethodVisitor = { const verifyConstructorVisitor = traverse.visitors.merge([ noMethodVisitor, { - MemberExpression: { - exit(path) { - const objectPath = path.get("object"); - if (this.isDerived && !this.hasBareSuper && objectPath.isSuper()) { - const hasArrowFunctionParent = path.findParent(p => - p.isArrowFunctionExpression(), - ); - if (!hasArrowFunctionParent) { - throw objectPath.buildCodeFrameError( - "'super.*' is not allowed before super()", - ); - } - } - }, - }, - CallExpression: { exit(path) { if (path.get("callee").isSuper()) { @@ -48,14 +32,20 @@ const verifyConstructorVisitor = traverse.visitors.merge([ }, ThisExpression(path) { - if (this.isDerived && !this.hasBareSuper) { - const fn = path.find(p => p.isFunction()); - - if (!fn || !fn.isArrowFunctionExpression()) { - throw path.buildCodeFrameError( - "'this' is not allowed before super()", - ); + if (this.isDerived) { + if (path.parentPath.isMemberExpression({ object: path.node })) { + // In cases like this.foo or this[foo], there is no need to add + // assertThisInitialized, since they already throw if this is + // undefined. + return; } + + const assertion = t.callExpression( + this.file.addHelper("assertThisInitialized"), + [path.node], + ); + path.replaceWith(assertion); + path.skip(); } }, }, @@ -271,6 +261,7 @@ export default class ClassTransformer { methodNode: node, objectRef: this.classRef, superRef: this.superName, + inConstructor: isConstructor, isStatic: node.static, isLoose: this.isLoose, scope: this.scope, @@ -444,10 +435,6 @@ export default class ClassTransformer { const path = this.userConstructorPath; const body = path.get("body"); - if (!this.hasBareSuper && !this.superReturns.length) { - throw path.buildCodeFrameError("missing super() call in constructor"); - } - path.traverse(findThisesVisitor, this); let guaranteedSuperBeforeFinish = !!this.bareSupers.length; @@ -469,7 +456,11 @@ export default class ClassTransformer { return true; } - if (parentPath.isLoop() || parentPath.isConditional()) { + if ( + parentPath.isLoop() || + parentPath.isConditional() || + parentPath.isArrowFunctionExpression() + ) { guaranteedSuperBeforeFinish = false; return true; } @@ -485,9 +476,13 @@ export default class ClassTransformer { if (this.isLoose) { wrapReturn = returnArg => { + const thisExpr = t.callExpression( + this.file.addHelper("assertThisInitialized"), + [thisRef()], + ); return returnArg - ? t.logicalExpression("||", returnArg, thisRef()) - : thisRef(); + ? t.logicalExpression("||", returnArg, thisExpr) + : thisExpr; }; } else { wrapReturn = returnArg => @@ -500,7 +495,7 @@ export default class ClassTransformer { // if we have a return as the last node in the body then we've already caught that // return const bodyPaths = body.get("body"); - if (bodyPaths.length && !bodyPaths.pop().isReturnStatement()) { + if (!bodyPaths.length || !bodyPaths.pop().isReturnStatement()) { body.pushContainer( "body", t.returnStatement( diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose-classCallCheck/with-superClass/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/loose-classCallCheck/with-superClass/expected.js index 3c808277b6..a8e18067dd 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/loose-classCallCheck/with-superClass/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose-classCallCheck/with-superClass/expected.js @@ -1,3 +1,5 @@ +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } let B = function B() {}; @@ -11,7 +13,7 @@ function (_B) { var _this; if (track !== undefined) _this = _B.call(this, track) || this;else _this = _B.call(this) || this; - return _this; + return _assertThisInitialized(_this); } return A; diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-must-call-super/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-must-call-super/exec.js new file mode 100644 index 0000000000..b4aedfd3f5 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-must-call-super/exec.js @@ -0,0 +1,9 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + + } +} + +assert.throws(() => new Foo(), /this hasn't been initialised/); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-must-call-super/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-must-call-super/expected.js new file mode 100644 index 0000000000..ecb4d54469 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-must-call-super/expected.js @@ -0,0 +1,13 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inheritsLoose(Foo, _Bar); + + function Foo() { + var _this; + + return babelHelpers.assertThisInitialized(_this); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-must-call-super/options.json b/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-must-call-super/options.json deleted file mode 100644 index 5acf285d06..0000000000 --- a/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-must-call-super/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "throws": "missing super() call in constructor", - "plugins": ["transform-classes"] -} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-no-super-return-falsey/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-no-super-return-falsey/expected.js index d4302c852a..8f91a1a798 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-no-super-return-falsey/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-no-super-return-falsey/expected.js @@ -6,7 +6,7 @@ function (_Base) { function Child() { var _this; - return false || _this; + return false || babelHelpers.assertThisInitialized(_this); } return Child; diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-no-super-return-object/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-no-super-return-object/expected.js index c1f860fad0..9d6464d2f2 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-no-super-return-object/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/derived-constructor-no-super-return-object/expected.js @@ -6,7 +6,7 @@ function (_Base) { function Child() { var _this; - return {} || _this; + return {} || babelHelpers.assertThisInitialized(_this); } return Child; diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/3028/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/3028/expected.js index aa11c0529d..2205f40bce 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/regression/3028/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/regression/3028/expected.js @@ -21,7 +21,7 @@ function (_b) { _this = babelHelpers.possibleConstructorReturn(this, (a1.__proto__ || Object.getPrototypeOf(a1)).call(this)); _this.x = function () { - return _this; + return babelHelpers.assertThisInitialized(_this); }; return _this; @@ -42,7 +42,7 @@ function (_b2) { _this2 = babelHelpers.possibleConstructorReturn(this, (a2.__proto__ || Object.getPrototypeOf(a2)).call(this)); _this2.x = function () { - return _this2; + return babelHelpers.assertThisInitialized(_this2); }; return _this2; diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/T7537/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/T7537/expected.js index 1a7251e480..dc8a3c6389 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/regression/T7537/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/regression/T7537/expected.js @@ -1,6 +1,6 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } 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; } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-class/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-class/expected.js index 94d13bbaf2..f79a960451 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-class/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-class/expected.js @@ -11,12 +11,12 @@ function (_Foo) { babelHelpers.classCallCheck(this, Test); woops.super.test(); _this = babelHelpers.possibleConstructorReturn(this, (Test.__proto__ || Object.getPrototypeOf(Test)).call(this)); - babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this).call(_this); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", babelHelpers.assertThisInitialized(_this)).call(_this); _this = babelHelpers.possibleConstructorReturn(this, (Test.__proto__ || Object.getPrototypeOf(Test)).apply(this, arguments)); _this = babelHelpers.possibleConstructorReturn(this, (_ref = Test.__proto__ || Object.getPrototypeOf(Test)).call.apply(_ref, [this, "test"].concat(Array.prototype.slice.call(arguments)))); - babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this).apply(_this, arguments); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", babelHelpers.assertThisInitialized(_this)).apply(_this, arguments); - (_babelHelpers$get = babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this)).call.apply(_babelHelpers$get, [_this, "test"].concat(Array.prototype.slice.call(arguments))); + (_babelHelpers$get = babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", babelHelpers.assertThisInitialized(_this))).call.apply(_babelHelpers$get, [_this, "test"].concat(Array.prototype.slice.call(arguments))); return _this; } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-properties/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-properties/expected.js index 3c2d63221d..91f538dcf2 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-properties/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-properties/expected.js @@ -8,8 +8,8 @@ function (_Foo) { babelHelpers.classCallCheck(this, Test); _this = babelHelpers.possibleConstructorReturn(this, (Test.__proto__ || Object.getPrototypeOf(Test)).call(this)); - babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this); - babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this).whatever; + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", babelHelpers.assertThisInitialized(_this)); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", babelHelpers.assertThisInitialized(_this)).whatever; return _this; } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/calling-super-properties/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/calling-super-properties/expected.js index dc5fa2853e..fe64ce3646 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/calling-super-properties/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/calling-super-properties/expected.js @@ -8,8 +8,8 @@ function (_Foo) { babelHelpers.classCallCheck(this, Test); _this = babelHelpers.possibleConstructorReturn(this, (Test.__proto__ || Object.getPrototypeOf(Test)).call(this)); - babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this).whatever(); - babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this).call(_this); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", babelHelpers.assertThisInitialized(_this)).whatever(); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", babelHelpers.assertThisInitialized(_this)).call(_this); return _this; } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-2/actual.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-2/actual.js new file mode 100644 index 0000000000..985f12206f --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-2/actual.js @@ -0,0 +1,5 @@ +class Foo extends Bar { + constructor() { + if (eval("false")) super(); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-2/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-2/exec.js new file mode 100644 index 0000000000..b28eabdab7 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-2/exec.js @@ -0,0 +1,9 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + if (eval("false")) super(); + } +} + +assert.throws(() => new Foo(), /this hasn't been initialised/); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-2/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-2/expected.js new file mode 100644 index 0000000000..bd43f1f6c5 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-2/expected.js @@ -0,0 +1,15 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + if (eval("false")) _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); + return babelHelpers.possibleConstructorReturn(_this); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-3/actual.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-3/actual.js new file mode 100644 index 0000000000..c6473d67ca --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-3/actual.js @@ -0,0 +1,6 @@ +class Foo extends Bar { + constructor() { + const fn = () => super(); + fn(); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-3/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-3/exec.js new file mode 100644 index 0000000000..b5546d3fd1 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-3/exec.js @@ -0,0 +1,10 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + const fn = () => super(); + fn(); + } +} + +new Foo(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-3/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-3/expected.js new file mode 100644 index 0000000000..5ab73330a4 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-3/expected.js @@ -0,0 +1,18 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + + var fn = () => _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); + + fn(); + return babelHelpers.possibleConstructorReturn(_this); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-4/actual.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-4/actual.js new file mode 100644 index 0000000000..0ea2e049fa --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-4/actual.js @@ -0,0 +1,5 @@ +class Foo extends Bar { + constructor() { + const fn = () => super(); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-4/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-4/exec.js new file mode 100644 index 0000000000..032b3293f3 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-4/exec.js @@ -0,0 +1,9 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + const fn = () => super(); + } +} + +assert.throws(() => new Foo(), /this hasn't been initialised/); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-4/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-4/expected.js new file mode 100644 index 0000000000..99b2cd7793 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super-4/expected.js @@ -0,0 +1,17 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + + var fn = () => _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); + + return babelHelpers.possibleConstructorReturn(_this); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super/exec.js new file mode 100644 index 0000000000..b4aedfd3f5 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super/exec.js @@ -0,0 +1,9 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + + } +} + +assert.throws(() => new Foo(), /this hasn't been initialised/); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super/expected.js new file mode 100644 index 0000000000..d1029e22e3 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super/expected.js @@ -0,0 +1,14 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + return babelHelpers.possibleConstructorReturn(_this); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super/options.json deleted file mode 100644 index 5acf285d06..0000000000 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/derived-constructor-must-call-super/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "throws": "missing super() call in constructor", - "plugins": ["transform-classes"] -} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-function-fallback/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-function-fallback/expected.js index baca2fdc01..a1a0e6294a 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-function-fallback/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-function-fallback/expected.js @@ -1,4 +1,4 @@ var Test = function Test() { babelHelpers.classCallCheck(this, Test); - babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "hasOwnProperty", this).call(this, "test"); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "hasOwnProperty", babelHelpers.assertThisInitialized(this)).call(this, "test"); }; diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super-inline/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super-inline/exec.js new file mode 100644 index 0000000000..32af08bde9 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super-inline/exec.js @@ -0,0 +1,9 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + super.foo(super()); + } +} + +assert.throws(() => new Foo(), /this hasn't been initialised/); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super-inline/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super-inline/expected.js new file mode 100644 index 0000000000..e019eadfd9 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super-inline/expected.js @@ -0,0 +1,27 @@ +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } 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; } + +function _get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return _get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +var Foo = +/*#__PURE__*/ +function (_Bar) { + _inherits(Foo, _Bar); + + function Foo() { + var _this; + + _classCallCheck(this, Foo); + + _get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), "foo", _assertThisInitialized(_this)).call(_this, _this = _possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this))); + + return _this; + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super-inline/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super-inline/options.json index 31d4d114ab..5d03380e6f 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super-inline/options.json +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super-inline/options.json @@ -1,4 +1,3 @@ { - "throws": "'super.*' is not allowed before super()", - "plugins": ["transform-classes"] + "plugins": ["transform-classes", "transform-block-scoping"] } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super/exec.js new file mode 100644 index 0000000000..bccb02b6b4 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super/exec.js @@ -0,0 +1,10 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + super.foo(); + super(); + } +} + +assert.throws(() => new Foo(), /this hasn't been initialised/); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super/expected.js new file mode 100644 index 0000000000..854033398b --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super/expected.js @@ -0,0 +1,27 @@ +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } 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; } + +function _get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return _get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +var Foo = +/*#__PURE__*/ +function (_Bar) { + _inherits(Foo, _Bar); + + function Foo() { + var _this; + + _classCallCheck(this, Foo); + + _get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), "foo", _assertThisInitialized(_this)).call(_this); + + return _this = _possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super/options.json index 31d4d114ab..5d03380e6f 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super/options.json +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-bare-super/options.json @@ -1,4 +1,3 @@ { - "throws": "'super.*' is not allowed before super()", - "plugins": ["transform-classes"] + "plugins": ["transform-classes", "transform-block-scoping"] } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/actual.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/actual.js index 1d570b180f..e3b40c34f1 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/actual.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/actual.js @@ -1,6 +1,6 @@ class Foo extends Bar { constructor() { - const t = () => super.test() + var t = () => super.test() super.foo(); super(); } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/exec.js new file mode 100644 index 0000000000..95a7339037 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/exec.js @@ -0,0 +1,13 @@ +class Bar { + test() {} +} + +class Foo extends Bar { + constructor() { + const t = () => super.test() + t(); + super(); + } +} + +assert.throws(() => new Foo(), /this hasn't been initialised/); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/expected.js new file mode 100644 index 0000000000..248f97f717 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/expected.js @@ -0,0 +1,18 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + + var t = () => babelHelpers.get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), "test", babelHelpers.assertThisInitialized(_this)).call(_this); + + babelHelpers.get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), "foo", babelHelpers.assertThisInitialized(_this)).call(_this); + return _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/options.json index 450ed0282e..111b0a6091 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/options.json +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-2/options.json @@ -1,4 +1,3 @@ { - "throws": "'super.*' is not allowed before super()", - "plugins": ["external-helpers", "transform-classes"] + "plugins": ["external-helpers", "transform-classes", "transform-block-scoping"] } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/actual.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/actual.js new file mode 100644 index 0000000000..29c1f5ac05 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/actual.js @@ -0,0 +1,7 @@ +class Foo extends Bar { + constructor() { + const t = () => super.test() + super(); + t(); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/exec.js new file mode 100644 index 0000000000..cb85303d3d --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/exec.js @@ -0,0 +1,13 @@ +class Bar { + test() {} +} + +class Foo extends Bar { + constructor() { + const t = () => super.test() + super(); + t(); + } +} + +new Foo(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/expected.js new file mode 100644 index 0000000000..a856f88fbb --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/expected.js @@ -0,0 +1,19 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + + var t = () => babelHelpers.get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), "test", babelHelpers.assertThisInitialized(_this)).call(_this); + + _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); + t(); + return _this; + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/options.json new file mode 100644 index 0000000000..111b0a6091 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda-3/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["external-helpers", "transform-classes", "transform-block-scoping"] +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda/exec.js new file mode 100644 index 0000000000..3a2dad5f20 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda/exec.js @@ -0,0 +1,12 @@ +class Bar { + test() {} +} + +class Foo extends Bar { + constructor() { + const t = () => super.test() + super(); + } +} + +new Foo(); \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda/expected.js index d794d9f873..e973f819b9 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-before-in-lambda/expected.js @@ -8,7 +8,7 @@ function (_Bar) { babelHelpers.classCallCheck(this, Foo); - var t = () => babelHelpers.get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), "test", _this).call(_this); + var t = () => babelHelpers.get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), "test", babelHelpers.assertThisInitialized(_this)).call(_this); return _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-in-prop-exression/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-in-prop-exression/expected.js index ff8910b032..9249a2256e 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-in-prop-exression/expected.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-reference-in-prop-exression/expected.js @@ -7,7 +7,7 @@ function (_Bar) { var _this; babelHelpers.classCallCheck(this, Foo); - babelHelpers.get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), (_this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this))).method, _this).call(_this); + babelHelpers.get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), (_this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this))).method, babelHelpers.assertThisInitialized(_this)).call(_this); return _this; } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-2/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-2/exec.js new file mode 100644 index 0000000000..8cc0a836a1 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-2/exec.js @@ -0,0 +1,9 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + super(this); + } +} + +assert.throws(() => new Foo(), /this hasn't been initialised/); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-2/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-2/expected.js new file mode 100644 index 0000000000..eacbb60486 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-2/expected.js @@ -0,0 +1,14 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + return _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this, babelHelpers.assertThisInitialized(_this))); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-2/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-2/options.json deleted file mode 100644 index 1127f3cba4..0000000000 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-2/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "throws": "'this' is not allowed before super()", - "plugins": ["transform-classes"] -} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-3/actual.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-3/actual.js new file mode 100644 index 0000000000..966c4b9e78 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-3/actual.js @@ -0,0 +1,7 @@ +class Foo extends Bar { + constructor() { + const fn = () => this; + fn(); + super(); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-3/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-3/exec.js new file mode 100644 index 0000000000..80c1b94f54 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-3/exec.js @@ -0,0 +1,11 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + const fn = () => this; + fn(); + super(); + } +} + +assert.throws(() => new Foo(), /this hasn't been initialised/); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-3/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-3/expected.js new file mode 100644 index 0000000000..ee5d13b48e --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-3/expected.js @@ -0,0 +1,18 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + + var fn = () => babelHelpers.assertThisInitialized(_this); + + fn(); + return _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-4/actual.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-4/actual.js new file mode 100644 index 0000000000..41172aeba7 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-4/actual.js @@ -0,0 +1,7 @@ +class Foo extends Bar { + constructor() { + const fn = () => this; + super(); + fn(); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-4/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-4/exec.js new file mode 100644 index 0000000000..fd74386694 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-4/exec.js @@ -0,0 +1,11 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + const fn = () => this; + super(); + fn(); + } +} + +new Foo(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-4/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-4/expected.js new file mode 100644 index 0000000000..42144392f3 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-4/expected.js @@ -0,0 +1,19 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + + var fn = () => babelHelpers.assertThisInitialized(_this); + + _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); + fn(); + return _this; + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-5/actual.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-5/actual.js new file mode 100644 index 0000000000..3011d5d39a --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-5/actual.js @@ -0,0 +1,5 @@ +class Foo extends Bar { + constructor() { + Foo[this]; + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-5/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-5/exec.js new file mode 100644 index 0000000000..af632c07c4 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-5/exec.js @@ -0,0 +1,9 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + Foo[this]; + } +} + +assert.throws(() => new Foo(), /this hasn't been initialised/); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-5/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-5/expected.js new file mode 100644 index 0000000000..ef448dd71d --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes-5/expected.js @@ -0,0 +1,15 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + Foo[babelHelpers.assertThisInitialized(_this)]; + return babelHelpers.possibleConstructorReturn(_this); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes/exec.js new file mode 100644 index 0000000000..08de38754b --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes/exec.js @@ -0,0 +1,10 @@ +class Bar {} + +class Foo extends Bar { + constructor() { + this.foo = "bar"; + super(); + } +} + +assert.throws(() => new Foo()); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes/expected.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes/expected.js new file mode 100644 index 0000000000..b505f250e4 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes/expected.js @@ -0,0 +1,15 @@ +var Foo = +/*#__PURE__*/ +function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + _this.foo = "bar"; + return _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); + } + + return Foo; +}(Bar); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes/options.json deleted file mode 100644 index 1127f3cba4..0000000000 --- a/packages/babel-plugin-transform-classes/test/fixtures/spec/this-not-allowed-before-super-in-derived-classes/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "throws": "'this' is not allowed before super()", - "plugins": ["transform-classes"] -} diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/regression/6057-expanded/expected.js b/packages/babel-plugin-transform-parameters/test/fixtures/regression/6057-expanded/expected.js index 9c03b40d90..c3554cc0ec 100644 --- a/packages/babel-plugin-transform-parameters/test/fixtures/regression/6057-expanded/expected.js +++ b/packages/babel-plugin-transform-parameters/test/fixtures/regression/6057-expanded/expected.js @@ -19,10 +19,12 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } 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; } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + var App = /*#__PURE__*/ function (_Component) { @@ -39,7 +41,7 @@ function (_Component) { args[_key] = arguments[_key]; } - return _possibleConstructorReturn(_this, (_temp = _this = _possibleConstructorReturn(this, (_ref = App.__proto__ || Object.getPrototypeOf(App)).call.apply(_ref, [this].concat(args))), Object.defineProperty(_this, "exportType", { + return _possibleConstructorReturn(_this, (_temp = _this = _possibleConstructorReturn(this, (_ref = App.__proto__ || Object.getPrototypeOf(App)).call.apply(_ref, [this].concat(args))), Object.defineProperty(_assertThisInitialized(_this), "exportType", { configurable: true, enumerable: true, writable: true,