From cdee4f0cc5455d4d8e1e6b64f6c8aee5bd66f086 Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Wed, 15 Jun 2016 16:34:30 +0200 Subject: [PATCH 1/4] Fix class inheritance in IE9 & IE10 (T3041) Internet Explorer 9&10 do not support __proto__ at all, don't have Object.setPrototypeOf(), but have Object.getPrototypeOf(). Because of this setting the prototype is not possible, which makes the babelHelpers.inherits() function to set __proto__ although not supported. Afterwards Object.getPrototypeOf() is used, but this one is not respecting the "custom" property __proto__ that we set. The solution is to check for __proto__ first and afterwards fallback to Object.getPrototypeOf(). --- .../src/vanilla.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js index 351dbcc1aec0..34109568af80 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js +++ b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js @@ -345,9 +345,13 @@ export default class ClassTransformer { } } else { bareSuperNode = optimiseCall( - t.callExpression( - t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")), - [this.classRef] + t.logicalExpression( + "||", + t.memberExpression(this.classRef, t.identifier("__proto__")), + t.callExpression( + t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")), + [this.classRef] + ) ), t.thisExpression(), bareSuperNode.arguments From 4fbf43f3ced12f3380d617a32a7eeb546ae075dd Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Wed, 15 Jun 2016 18:18:34 +0200 Subject: [PATCH 2/4] Do the same logic in babel-helper-replace-supers --- .../babel-helper-replace-supers/src/index.js | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index 7010cb167012..4cf27b731321 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -125,11 +125,18 @@ export default class ReplaceSupers { return t.callExpression( this.file.addHelper("set"), [ - t.callExpression( - t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")), - [ - this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype")) - ] + t.logicalExpression( + "||", + t.memberExpression( + this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype")), + t.identifier("__proto__") + ), + t.callExpression( + t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")), + [ + this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype")) + ] + ), ), isComputed ? property : t.stringLiteral(property.name), value, @@ -151,11 +158,18 @@ export default class ReplaceSupers { return t.callExpression( this.file.addHelper("get"), [ - t.callExpression( - t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")), - [ - this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype")) - ] + t.logicalExpression( + "||", + t.memberExpression( + this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype")), + t.identifier("__proto__") + ), + t.callExpression( + t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")), + [ + this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype")) + ] + ), ), isComputed ? property : t.stringLiteral(property.name), t.thisExpression() From 441b8c8ee4d89cf7d7808fe48eaa4f1fce7b6972 Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Wed, 15 Jun 2016 18:18:48 +0200 Subject: [PATCH 3/4] Fix tests --- .../misc/regression-1155/expected.js | 2 +- .../test/fixtures/general/derived/expected.js | 2 +- .../test/fixtures/general/foobar/expected.js | 2 +- .../general/super-expression/expected.js | 2 +- .../general/super-statement/expected.js | 2 +- .../fixtures/regression/T6719/expected.js | 2 +- .../test/fixtures/regression/2663/expected.js | 2 +- .../test/fixtures/regression/2694/expected.js | 4 +-- .../test/fixtures/regression/2775/expected.js | 2 +- .../test/fixtures/regression/3028/expected.js | 4 +-- .../fixtures/regression/T2494/expected.js | 2 +- .../fixtures/regression/T2997/expected.js | 2 +- .../spec/accessing-super-class/expected.js | 26 +++++++++---------- .../accessing-super-properties/expected.js | 6 ++--- .../spec/calling-super-properties/expected.js | 8 +++--- .../fixtures/spec/constructor/expected.js | 2 +- .../expected.js | 2 +- .../spec/export-super-class/expected.js | 2 +- .../expected.js | 5 ---- .../spec/super-class-anonymous/expected.js | 10 +++---- .../expected.js | 4 +-- .../fixtures/spec/super-class/expected.js | 2 +- .../spec/super-function-fallback/expected.js | 2 +- .../function-name/modules-3/expected.js | 2 +- .../object-super/statically-bound/expected.js | 2 +- .../parameters/rest-nested-iife/expected.js | 2 +- 26 files changed, 49 insertions(+), 54 deletions(-) delete mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-call-only-allowed-in-derived-constructor/expected.js diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1155/expected.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1155/expected.js index a42483812875..3f13d8542d2b 100644 --- a/packages/babel-core/test/fixtures/transformation/misc/regression-1155/expected.js +++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1155/expected.js @@ -8,7 +8,7 @@ var Foo = function (_Bar) { parentOptions.init = function () { this; }; - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this, parentOptions)); + return babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this, parentOptions)); } return Foo; diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/general/derived/expected.js b/packages/babel-plugin-transform-class-properties/test/fixtures/general/derived/expected.js index 5fa7c1476e40..21e5e93b9bc5 100644 --- a/packages/babel-plugin-transform-class-properties/test/fixtures/general/derived/expected.js +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/general/derived/expected.js @@ -5,7 +5,7 @@ var Foo = function (_Bar) { var _temp, _this, _ret; babelHelpers.classCallCheck(this, Foo); - return _ret = (_temp = (_this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this, ...args)), _this), _this.bar = "foo", _temp), babelHelpers.possibleConstructorReturn(_this, _ret); + return _ret = (_temp = (_this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this, ...args)), _this), _this.bar = "foo", _temp), babelHelpers.possibleConstructorReturn(_this, _ret); } return Foo; diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/general/foobar/expected.js b/packages/babel-plugin-transform-class-properties/test/fixtures/general/foobar/expected.js index fdc9b47fbf13..24efd55c1fe1 100644 --- a/packages/babel-plugin-transform-class-properties/test/fixtures/general/foobar/expected.js +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/general/foobar/expected.js @@ -6,7 +6,7 @@ var Child = function (_Parent) { function Child() { babelHelpers.classCallCheck(this, Child); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Child).call(this)); + var _this = babelHelpers.possibleConstructorReturn(this, (Child.__proto__ || Object.getPrototypeOf(Child)).call(this)); _this.scopedFunctionWithThis = function () { _this.name = {}; diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/general/super-expression/expected.js b/packages/babel-plugin-transform-class-properties/test/fixtures/general/super-expression/expected.js index f26716cd91c5..1ddfb8c339f9 100644 --- a/packages/babel-plugin-transform-class-properties/test/fixtures/general/super-expression/expected.js +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/general/super-expression/expected.js @@ -6,7 +6,7 @@ var Foo = function (_Bar) { babelHelpers.classCallCheck(this, Foo); - foo((_temp = (_this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this)), _this), _this.bar = "foo", _temp)); + foo((_temp = (_this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)), _this), _this.bar = "foo", _temp)); return _this; } diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/general/super-statement/expected.js b/packages/babel-plugin-transform-class-properties/test/fixtures/general/super-statement/expected.js index 206f437f1a47..ff1a04df2ca8 100644 --- a/packages/babel-plugin-transform-class-properties/test/fixtures/general/super-statement/expected.js +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/general/super-statement/expected.js @@ -4,7 +4,7 @@ var Foo = function (_Bar) { function Foo() { babelHelpers.classCallCheck(this, Foo); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this)); + var _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); _this.bar = "foo"; return _this; diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/regression/T6719/expected.js b/packages/babel-plugin-transform-class-properties/test/fixtures/regression/T6719/expected.js index 15ce34f7de1a..7b990896f574 100644 --- a/packages/babel-plugin-transform-class-properties/test/fixtures/regression/T6719/expected.js +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/regression/T6719/expected.js @@ -6,7 +6,7 @@ function withContext(ComposedComponent) { function WithContext() { babelHelpers.classCallCheck(this, WithContext); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(WithContext).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (WithContext.__proto__ || Object.getPrototypeOf(WithContext)).apply(this, arguments)); } return WithContext; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2663/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2663/expected.js index 84ceeede836d..297c21e9440a 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2663/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2663/expected.js @@ -22,7 +22,7 @@ var Connection = function (_EventEmitter) { function Connection(endpoint, joinKey, joinData, roomId) { babelHelpers.classCallCheck(this, Connection); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Connection).call(this)); + var _this = babelHelpers.possibleConstructorReturn(this, (Connection.__proto__ || Object.getPrototypeOf(Connection)).call(this)); _this.isConnected = false; _this.roomId = roomId; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/expected.js index 21a29ff6d91b..60bbbdd652e9 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/expected.js @@ -13,13 +13,13 @@ var SubFoo = function (_BaseFoo) { function SubFoo() { babelHelpers.classCallCheck(this, SubFoo); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(SubFoo).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (SubFoo.__proto__ || Object.getPrototypeOf(SubFoo)).apply(this, arguments)); } babelHelpers.createClass(SubFoo, null, [{ key: 'talk', value: function talk() { - babelHelpers.get(Object.getPrototypeOf(SubFoo), 'talk', this).call(this); + babelHelpers.get(SubFoo.__proto__ || Object.getPrototypeOf(SubFoo), 'talk', this).call(this); console.log('SubFoo.talk'); } }]); diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2775/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2775/expected.js index 484001fb56e2..f7d596226a09 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2775/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2775/expected.js @@ -13,7 +13,7 @@ var RandomComponent = function (_Component) { function RandomComponent() { babelHelpers.classCallCheck(this, RandomComponent); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(RandomComponent).call(this)); + return babelHelpers.possibleConstructorReturn(this, (RandomComponent.__proto__ || Object.getPrototypeOf(RandomComponent)).call(this)); } babelHelpers.createClass(RandomComponent, [{ diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/expected.js index b663065caaa5..7edd63f2b219 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/3028/expected.js @@ -14,7 +14,7 @@ var a1 = function (_b) { function a1() { babelHelpers.classCallCheck(this, a1); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(a1).call(this)); + var _this = babelHelpers.possibleConstructorReturn(this, (a1.__proto__ || Object.getPrototypeOf(a1)).call(this)); _this.x = function () { return _this; @@ -31,7 +31,7 @@ var a2 = function (_b2) { function a2() { babelHelpers.classCallCheck(this, a2); - var _this2 = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(a2).call(this)); + var _this2 = babelHelpers.possibleConstructorReturn(this, (a2.__proto__ || Object.getPrototypeOf(a2)).call(this)); _this2.x = function () { return _this2; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2494/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2494/expected.js index 5f61e18c8e49..bdfad110494c 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2494/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2494/expected.js @@ -6,7 +6,7 @@ var x = { function _class() { babelHelpers.classCallCheck(this, _class); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (_class.__proto__ || Object.getPrototypeOf(_class)).apply(this, arguments)); } return _class; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/expected.js index 5bc287668a05..73f79a4130a9 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/expected.js @@ -12,7 +12,7 @@ var B = function (_A) { babelHelpers.classCallCheck(this, B); - return _ret = (_this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(B).call(this)), _this), babelHelpers.possibleConstructorReturn(_this, _ret); + return _ret = (_this = babelHelpers.possibleConstructorReturn(this, (B.__proto__ || Object.getPrototypeOf(B)).call(this)), _this), babelHelpers.possibleConstructorReturn(_this, _ret); } return B; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/accessing-super-class/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/accessing-super-class/expected.js index 72d7738a0df2..1b5dca926851 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/accessing-super-class/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/accessing-super-class/expected.js @@ -2,22 +2,22 @@ var Test = function (_Foo) { babelHelpers.inherits(Test, _Foo); function Test() { - var _Object$getPrototypeO, _babelHelpers$get; + var _ref, _babelHelpers$get; babelHelpers.classCallCheck(this, Test); woops.super.test(); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Test).call(this)); + var _this = babelHelpers.possibleConstructorReturn(this, (Test.__proto__ || Object.getPrototypeOf(Test)).call(this)); - babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this).call(_this); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this).call(_this); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Test).apply(this, arguments)); + var _this = babelHelpers.possibleConstructorReturn(this, (Test.__proto__ || Object.getPrototypeOf(Test)).apply(this, arguments)); - var _this = babelHelpers.possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(Test)).call.apply(_Object$getPrototypeO, [this, "test"].concat(Array.prototype.slice.call(arguments)))); + var _this = babelHelpers.possibleConstructorReturn(this, (_ref = Test.__proto__ || Object.getPrototypeOf(Test)).call.apply(_ref, [this, "test"].concat(Array.prototype.slice.call(arguments)))); - babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this).apply(_this, arguments); - (_babelHelpers$get = babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this)).call.apply(_babelHelpers$get, [_this, "test"].concat(Array.prototype.slice.call(arguments))); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _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))); return _this; } @@ -26,18 +26,18 @@ var Test = function (_Foo) { value: function test() { var _babelHelpers$get2; - babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", this).call(this); - babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", this).apply(this, arguments); - (_babelHelpers$get2 = babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", this)).call.apply(_babelHelpers$get2, [this, "test"].concat(Array.prototype.slice.call(arguments))); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", this).call(this); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", this).apply(this, arguments); + (_babelHelpers$get2 = babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", this)).call.apply(_babelHelpers$get2, [this, "test"].concat(Array.prototype.slice.call(arguments))); } }], [{ key: "foo", value: function foo() { var _babelHelpers$get3; - babelHelpers.get(Object.getPrototypeOf(Test), "foo", this).call(this); - babelHelpers.get(Object.getPrototypeOf(Test), "foo", this).apply(this, arguments); - (_babelHelpers$get3 = babelHelpers.get(Object.getPrototypeOf(Test), "foo", this)).call.apply(_babelHelpers$get3, [this, "test"].concat(Array.prototype.slice.call(arguments))); + babelHelpers.get(Test.__proto__ || Object.getPrototypeOf(Test), "foo", this).call(this); + babelHelpers.get(Test.__proto__ || Object.getPrototypeOf(Test), "foo", this).apply(this, arguments); + (_babelHelpers$get3 = babelHelpers.get(Test.__proto__ || Object.getPrototypeOf(Test), "foo", this)).call.apply(_babelHelpers$get3, [this, "test"].concat(Array.prototype.slice.call(arguments))); } }]); return Test; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/accessing-super-properties/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/accessing-super-properties/expected.js index 6083507ff291..217d2e080201 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/accessing-super-properties/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/accessing-super-properties/expected.js @@ -4,10 +4,10 @@ var Test = function (_Foo) { function Test() { babelHelpers.classCallCheck(this, Test); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Test).call(this)); + var _this = babelHelpers.possibleConstructorReturn(this, (Test.__proto__ || Object.getPrototypeOf(Test)).call(this)); - babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this); - babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this).whatever; + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "test", _this).whatever; return _this; } diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/calling-super-properties/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/calling-super-properties/expected.js index 27180ca048a6..d8933852db8c 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/calling-super-properties/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/calling-super-properties/expected.js @@ -4,17 +4,17 @@ var Test = function (_Foo) { function Test() { babelHelpers.classCallCheck(this, Test); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Test).call(this)); + var _this = babelHelpers.possibleConstructorReturn(this, (Test.__proto__ || Object.getPrototypeOf(Test)).call(this)); - babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this).whatever(); - babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this).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); return _this; } babelHelpers.createClass(Test, null, [{ key: "test", value: function test() { - return babelHelpers.get(Object.getPrototypeOf(Test), "wow", this).call(this); + return babelHelpers.get(Test.__proto__ || Object.getPrototypeOf(Test), "wow", this).call(this); } }]); return Test; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/constructor/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/constructor/expected.js index 777d4fe01dc0..87032199035b 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/constructor/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/constructor/expected.js @@ -10,7 +10,7 @@ var Foo = function (_Bar) { function Foo() { babelHelpers.classCallCheck(this, Foo); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this)); + var _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); _this.state = "test"; return _this; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/delay-arrow-function-for-bare-super-derived/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/delay-arrow-function-for-bare-super-derived/expected.js index 406077385e25..56062ead8b56 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/delay-arrow-function-for-bare-super-derived/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/delay-arrow-function-for-bare-super-derived/expected.js @@ -5,7 +5,7 @@ var Foo = function (_Bar) { var _this; babelHelpers.classCallCheck(this, Foo); - return _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this, () => { + return _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this, () => { _this.test; })); } diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/export-super-class/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/export-super-class/expected.js index 1770aa74848f..8c889ce02622 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/export-super-class/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/export-super-class/expected.js @@ -3,7 +3,7 @@ var _class = function (_A) { function _class() { babelHelpers.classCallCheck(this, _class); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (_class.__proto__ || Object.getPrototypeOf(_class)).apply(this, arguments)); } return _class; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-call-only-allowed-in-derived-constructor/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-call-only-allowed-in-derived-constructor/expected.js deleted file mode 100644 index 898e1ce1c7ad..000000000000 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-call-only-allowed-in-derived-constructor/expected.js +++ /dev/null @@ -1,5 +0,0 @@ -var Foo = function Foo() { - babelHelpers.classCallCheck(this, Foo); - - Object.getPrototypeOf(Foo).call(this); -}; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class-anonymous/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class-anonymous/expected.js index e9bd89270d0b..9f7c7c64aaf8 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class-anonymous/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class-anonymous/expected.js @@ -3,7 +3,7 @@ var TestEmpty = function (_ref) { function TestEmpty() { babelHelpers.classCallCheck(this, TestEmpty); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(TestEmpty).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (TestEmpty.__proto__ || Object.getPrototypeOf(TestEmpty)).apply(this, arguments)); } return TestEmpty; @@ -20,7 +20,7 @@ var TestConstructorOnly = function (_ref2) { function TestConstructorOnly() { babelHelpers.classCallCheck(this, TestConstructorOnly); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(TestConstructorOnly).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (TestConstructorOnly.__proto__ || Object.getPrototypeOf(TestConstructorOnly)).apply(this, arguments)); } return TestConstructorOnly; @@ -37,7 +37,7 @@ var TestMethodOnly = function (_ref3) { function TestMethodOnly() { babelHelpers.classCallCheck(this, TestMethodOnly); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(TestMethodOnly).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (TestMethodOnly.__proto__ || Object.getPrototypeOf(TestMethodOnly)).apply(this, arguments)); } return TestMethodOnly; @@ -58,7 +58,7 @@ var TestConstructorAndMethod = function (_ref4) { function TestConstructorAndMethod() { babelHelpers.classCallCheck(this, TestConstructorAndMethod); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(TestConstructorAndMethod).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (TestConstructorAndMethod.__proto__ || Object.getPrototypeOf(TestConstructorAndMethod)).apply(this, arguments)); } return TestConstructorAndMethod; @@ -79,7 +79,7 @@ var TestMultipleMethods = function (_ref5) { function TestMultipleMethods() { babelHelpers.classCallCheck(this, TestMultipleMethods); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(TestMultipleMethods).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (TestMultipleMethods.__proto__ || Object.getPrototypeOf(TestMultipleMethods)).apply(this, arguments)); } return TestMultipleMethods; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class-id-member-expression/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class-id-member-expression/expected.js index 00044b30a95c..1947994db24a 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class-id-member-expression/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class-id-member-expression/expected.js @@ -3,7 +3,7 @@ var BaseController = function (_Chaplin$Controller) { function BaseController() { babelHelpers.classCallCheck(this, BaseController); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(BaseController).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (BaseController.__proto__ || Object.getPrototypeOf(BaseController)).apply(this, arguments)); } return BaseController; @@ -14,7 +14,7 @@ var BaseController2 = function (_Chaplin$Controller$A) { function BaseController2() { babelHelpers.classCallCheck(this, BaseController2); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(BaseController2).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (BaseController2.__proto__ || Object.getPrototypeOf(BaseController2)).apply(this, arguments)); } return BaseController2; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class/expected.js index b1788253280d..32d5e1fc454b 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-class/expected.js @@ -3,7 +3,7 @@ var Test = function (_Foo) { function Test() { babelHelpers.classCallCheck(this, Test); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Test).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (Test.__proto__ || Object.getPrototypeOf(Test)).apply(this, arguments)); } return Test; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-function-fallback/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-function-fallback/expected.js index 26b0ffd3e114..8e03f0163eb5 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-function-fallback/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-function-fallback/expected.js @@ -1,5 +1,5 @@ var Test = function Test() { babelHelpers.classCallCheck(this, Test); - babelHelpers.get(Object.getPrototypeOf(Test.prototype), "hasOwnProperty", this).call(this, "test"); + babelHelpers.get(Test.prototype.__proto__ || Object.getPrototypeOf(Test.prototype), "hasOwnProperty", this).call(this, "test"); }; diff --git a/packages/babel-plugin-transform-es2015-function-name/test/fixtures/function-name/modules-3/expected.js b/packages/babel-plugin-transform-es2015-function-name/test/fixtures/function-name/modules-3/expected.js index f2a53010a564..0bf6d8fc2274 100644 --- a/packages/babel-plugin-transform-es2015-function-name/test/fixtures/function-name/modules-3/expected.js +++ b/packages/babel-plugin-transform-es2015-function-name/test/fixtures/function-name/modules-3/expected.js @@ -11,7 +11,7 @@ let Login = function (_React$Component) { function Login() { babelHelpers.classCallCheck(this, Login); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Login).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (Login.__proto__ || Object.getPrototypeOf(Login)).apply(this, arguments)); } babelHelpers.createClass(Login, [{ diff --git a/packages/babel-plugin-transform-es2015-object-super/test/fixtures/object-super/statically-bound/expected.js b/packages/babel-plugin-transform-es2015-object-super/test/fixtures/object-super/statically-bound/expected.js index 9bb61e58e734..7d3611def6d0 100644 --- a/packages/babel-plugin-transform-es2015-object-super/test/fixtures/object-super/statically-bound/expected.js +++ b/packages/babel-plugin-transform-es2015-object-super/test/fixtures/object-super/statically-bound/expected.js @@ -2,6 +2,6 @@ var _obj; var o = _obj = { m: function () { - return babelHelpers.get(Object.getPrototypeOf(_obj), "x", this); + return babelHelpers.get(_obj.__proto__ || Object.getPrototypeOf(_obj), "x", this); } }; diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-nested-iife/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-nested-iife/expected.js index 6d0cfa21ca75..aa1fc6cf403b 100644 --- a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-nested-iife/expected.js +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-nested-iife/expected.js @@ -5,7 +5,7 @@ function broken(x) { function Foo() { babelHelpers.classCallCheck(this, Foo); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).apply(this, arguments)); } return Foo; From 7ae67fe4a18b3978294f7a4326d44f991576353a Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Wed, 15 Jun 2016 22:11:52 +0200 Subject: [PATCH 4/4] Extract creation of prototype nodes to small helper --- .../babel-helper-replace-supers/src/index.js | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index 4cf27b731321..4f0c29fb88b6 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -19,6 +19,33 @@ function isMemberExpressionSuper(node) { return t.isMemberExpression(node) && t.isSuper(node.object); } +/** + * Creates an expression which result is the proto of objectRef. + * Uses CLASS.__proto__ first for InternetExplorer <= 10 support + * + * @example isStatic === true + * + * CLASS.__proto__ || Object.getPrototypeOf(CLASS) + * + * @example isStatic === false + * + * CLASS.prototype.__proto__ || Object.getPrototypeOf(CLASS.prototype) + */ +function getPrototypeOfExpression(objectRef, isStatic) { + const targetRef = isStatic ? objectRef : t.memberExpression(objectRef, t.identifier("prototype")); + + return t.logicalExpression( + "||", + t.memberExpression(targetRef, t.identifier("__proto__")), + t.callExpression( + t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")), + [ + targetRef + ] + ), + ); +} + let visitor = { Function(path) { if (!path.inShadow("this")) { @@ -117,7 +144,7 @@ export default class ReplaceSupers { * * @example * - * _set(Object.getPrototypeOf(CLASS.prototype), "METHOD", "VALUE", this) + * _set(CLASS.prototype.__proto__ || Object.getPrototypeOf(CLASS.prototype), "METHOD", "VALUE", this) * */ @@ -125,19 +152,7 @@ export default class ReplaceSupers { return t.callExpression( this.file.addHelper("set"), [ - t.logicalExpression( - "||", - t.memberExpression( - this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype")), - t.identifier("__proto__") - ), - t.callExpression( - t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")), - [ - this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype")) - ] - ), - ), + getPrototypeOfExpression(this.getObjectRef(), this.isStatic), isComputed ? property : t.stringLiteral(property.name), value, t.thisExpression() @@ -150,7 +165,7 @@ export default class ReplaceSupers { * * @example * - * _get(Object.getPrototypeOf(CLASS.prototype), "METHOD", this) + * _get(CLASS.prototype.__proto__ || Object.getPrototypeOf(CLASS.prototype), "METHOD", this) * */ @@ -158,19 +173,7 @@ export default class ReplaceSupers { return t.callExpression( this.file.addHelper("get"), [ - t.logicalExpression( - "||", - t.memberExpression( - this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype")), - t.identifier("__proto__") - ), - t.callExpression( - t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")), - [ - this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype")) - ] - ), - ), + getPrototypeOfExpression(this.getObjectRef(), this.isStatic), isComputed ? property : t.stringLiteral(property.name), t.thisExpression() ]