From 0ee9a4e61209747f155e1143f3f8096d03ccd85f Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Sat, 14 Apr 2018 15:15:40 -0400 Subject: [PATCH] Fix default class super inheritance (#7732) Fixes #7683. --- .../src/transformClass.js | 5 ++-- .../test/fixtures/loose/default-super/exec.js | 17 +++++++++++++ .../fixtures/loose/default-super/input.js | 17 +++++++++++++ .../fixtures/loose/default-super/output.js | 22 ++++++++++++++++ .../loose/super-function-fallback/output.js | 2 +- .../test/fixtures/spec/default-super/exec.js | 17 +++++++++++++ .../test/fixtures/spec/default-super/input.js | 17 +++++++++++++ .../fixtures/spec/default-super/output.js | 25 +++++++++++++++++++ 8 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/exec.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/output.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/exec.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/output.js diff --git a/packages/babel-plugin-transform-classes/src/transformClass.js b/packages/babel-plugin-transform-classes/src/transformClass.js index d6e3c05404..b648bc25a8 100644 --- a/packages/babel-plugin-transform-classes/src/transformClass.js +++ b/packages/babel-plugin-transform-classes/src/transformClass.js @@ -382,7 +382,6 @@ export default function transformClass( let guaranteedSuperBeforeFinish = !!classState.bareSupers.size; - const superRef = classState.superName || t.identifier("Function"); let thisRef = function() { const ref = path.scope.generateDeclaredUidIdentifier("this"); thisRef = () => t.cloneNode(ref); @@ -390,7 +389,7 @@ export default function transformClass( }; for (const bareSuper of classState.bareSupers) { - wrapSuperCall(bareSuper, superRef, thisRef, body); + wrapSuperCall(bareSuper, classState.superName, thisRef, body); if (guaranteedSuperBeforeFinish) { bareSuper.find(function(parentPath) { @@ -638,7 +637,7 @@ export default function transformClass( classRef: classState.node.id ? t.identifier(classState.node.id.name) : classState.scope.generateUidIdentifier("class"), - superName: classState.node.superClass || t.identifier("Function"), + superName: classState.node.superClass, isDerived: !!classState.node.superClass, constructorBody: t.blockStatement([]), }); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/exec.js new file mode 100644 index 0000000000..eaba10ab2b --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/exec.js @@ -0,0 +1,17 @@ +class Test { + constructor() { + return super.constructor; + } + + static test() { + return super.constructor; + } +} + +// Instances +expect(Object.getPrototypeOf(Test.prototype)).toBe(Object.prototype); +expect(new Test()).toBe(Object); + +// Static +expect(Object.getPrototypeOf(Test)).toBe(Function.prototype); +expect(Test.test()).toBe(Function); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/input.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/input.js new file mode 100644 index 0000000000..eaba10ab2b --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/input.js @@ -0,0 +1,17 @@ +class Test { + constructor() { + return super.constructor; + } + + static test() { + return super.constructor; + } +} + +// Instances +expect(Object.getPrototypeOf(Test.prototype)).toBe(Object.prototype); +expect(new Test()).toBe(Object); + +// Static +expect(Object.getPrototypeOf(Test)).toBe(Function.prototype); +expect(Test.test()).toBe(Function); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/output.js new file mode 100644 index 0000000000..03bcc774b8 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/default-super/output.js @@ -0,0 +1,22 @@ +var Test = +/*#__PURE__*/ +function () { + "use strict"; + + function Test() { + return Object.prototype.constructor; + } + + Test.test = function test() { + return Function.prototype.constructor; + }; + + return Test; +}(); // Instances + + +expect(Object.getPrototypeOf(Test.prototype)).toBe(Object.prototype); +expect(new Test()).toBe(Object); // Static + +expect(Object.getPrototypeOf(Test)).toBe(Function.prototype); +expect(Test.test()).toBe(Function); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-function-fallback/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-function-fallback/output.js index 078d48fe93..80c59e3c70 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-function-fallback/output.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-function-fallback/output.js @@ -1,5 +1,5 @@ var Test = function Test() { "use strict"; - Function.prototype.hasOwnProperty.call(this, "test"); + Object.prototype.hasOwnProperty.call(this, "test"); }; diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/exec.js new file mode 100644 index 0000000000..eaba10ab2b --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/exec.js @@ -0,0 +1,17 @@ +class Test { + constructor() { + return super.constructor; + } + + static test() { + return super.constructor; + } +} + +// Instances +expect(Object.getPrototypeOf(Test.prototype)).toBe(Object.prototype); +expect(new Test()).toBe(Object); + +// Static +expect(Object.getPrototypeOf(Test)).toBe(Function.prototype); +expect(Test.test()).toBe(Function); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/input.js new file mode 100644 index 0000000000..eaba10ab2b --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/input.js @@ -0,0 +1,17 @@ +class Test { + constructor() { + return super.constructor; + } + + static test() { + return super.constructor; + } +} + +// Instances +expect(Object.getPrototypeOf(Test.prototype)).toBe(Object.prototype); +expect(new Test()).toBe(Object); + +// Static +expect(Object.getPrototypeOf(Test)).toBe(Function.prototype); +expect(Test.test()).toBe(Function); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/output.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/output.js new file mode 100644 index 0000000000..ca30a9e88a --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/default-super/output.js @@ -0,0 +1,25 @@ +var Test = +/*#__PURE__*/ +function () { + "use strict"; + + function Test() { + babelHelpers.classCallCheck(this, Test); + return babelHelpers.get(babelHelpers.getPrototypeOf(Test.prototype), "constructor", babelHelpers.assertThisInitialized(this)); + } + + babelHelpers.createClass(Test, null, [{ + key: "test", + value: function test() { + return babelHelpers.get(babelHelpers.getPrototypeOf(Test), "constructor", this); + } + }]); + return Test; +}(); // Instances + + +expect(Object.getPrototypeOf(Test.prototype)).toBe(Object.prototype); +expect(new Test()).toBe(Object); // Static + +expect(Object.getPrototypeOf(Test)).toBe(Function.prototype); +expect(Test.test()).toBe(Function);