mirror of
https://github.com/swc-project/swc.git
synced 2024-12-24 22:22:34 +03:00
fix(es/compat): Fix handling of constructor in classes
(#3505)
swc_ecma_transforms_compat: - Use `SuperFieldAccessFolder` for `super` fields in constructors. - Fix handling of variables in constructors with the same name as the class name. - Fix handling of functions in constructors with this/super.
This commit is contained in:
parent
2830438663
commit
0b162102fa
@ -111,7 +111,7 @@ var Derived3 = /*#__PURE__*/ function(Base2) {
|
|||||||
_classCallCheck(this, Derived3);
|
_classCallCheck(this, Derived3);
|
||||||
var _this;
|
var _this;
|
||||||
var r = function r() {
|
var r = function r() {
|
||||||
_this = _super.call(this);
|
super();
|
||||||
} // error
|
} // error
|
||||||
;
|
;
|
||||||
return _possibleConstructorReturn(_this);
|
return _possibleConstructorReturn(_this);
|
||||||
|
@ -73,8 +73,7 @@ var Base = function() {
|
|||||||
}(Base2), Derived3 = function(Base22) {
|
}(Base2), Derived3 = function(Base22) {
|
||||||
"use strict";
|
"use strict";
|
||||||
function Derived3() {
|
function Derived3() {
|
||||||
var _this;
|
return _classCallCheck(this, Derived3), _possibleConstructorReturn(void 0);
|
||||||
return _classCallCheck(this, Derived3), _possibleConstructorReturn(_this);
|
|
||||||
}
|
}
|
||||||
return _inherits(Derived3, Base22), _createSuper(Derived3), Derived3;
|
return _inherits(Derived3, Base22), _createSuper(Derived3), Derived3;
|
||||||
}(Base2), Derived4 = function(Base23) {
|
}(Base2), Derived4 = function(Base23) {
|
||||||
|
@ -239,9 +239,8 @@ var SomeDerived1 = //super.publicInstanceMemberNotFunction in constructor of der
|
|||||||
var _super = _createSuper(SomeDerived1);
|
var _super = _createSuper(SomeDerived1);
|
||||||
function SomeDerived1() {
|
function SomeDerived1() {
|
||||||
_classCallCheck(this, SomeDerived1);
|
_classCallCheck(this, SomeDerived1);
|
||||||
var _thisSuper;
|
|
||||||
var _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
_set((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(SomeDerived1.prototype)), "publicMember", 1, _thisSuper, true);
|
_set((_assertThisInitialized(_this), _getPrototypeOf(SomeDerived1.prototype)), "publicMember", 1, _this, true);
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
_createClass(SomeDerived1, [
|
_createClass(SomeDerived1, [
|
||||||
@ -286,9 +285,8 @@ var SomeDerived2 = //super.privateProperty in constructor of derived class
|
|||||||
var _super = _createSuper(SomeDerived2);
|
var _super = _createSuper(SomeDerived2);
|
||||||
function SomeDerived2() {
|
function SomeDerived2() {
|
||||||
_classCallCheck(this, SomeDerived2);
|
_classCallCheck(this, SomeDerived2);
|
||||||
var _thisSuper;
|
|
||||||
var _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
_set((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(SomeDerived2.prototype)), "privateMember", 1, _thisSuper, true);
|
_set((_assertThisInitialized(_this), _getPrototypeOf(SomeDerived2.prototype)), "privateMember", 1, _this, true);
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
_createClass(SomeDerived2, [
|
_createClass(SomeDerived2, [
|
||||||
|
@ -151,8 +151,8 @@ var SomeDerived1 = function(SomeBase) {
|
|||||||
var _super = _createSuper(SomeDerived1);
|
var _super = _createSuper(SomeDerived1);
|
||||||
function SomeDerived1() {
|
function SomeDerived1() {
|
||||||
_classCallCheck(this, SomeDerived1);
|
_classCallCheck(this, SomeDerived1);
|
||||||
var _thisSuper, _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
return _set((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(SomeDerived1.prototype)), "publicMember", 1, _thisSuper, !0), _this;
|
return _set((_assertThisInitialized(_this), _getPrototypeOf(SomeDerived1.prototype)), "publicMember", 1, _this, !0), _this;
|
||||||
}
|
}
|
||||||
return _createClass(SomeDerived1, [
|
return _createClass(SomeDerived1, [
|
||||||
{
|
{
|
||||||
@ -181,8 +181,8 @@ var SomeDerived1 = function(SomeBase) {
|
|||||||
var _super = _createSuper(SomeDerived2);
|
var _super = _createSuper(SomeDerived2);
|
||||||
function SomeDerived2() {
|
function SomeDerived2() {
|
||||||
_classCallCheck(this, SomeDerived2);
|
_classCallCheck(this, SomeDerived2);
|
||||||
var _thisSuper, _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
return _set((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(SomeDerived2.prototype)), "privateMember", 1, _thisSuper, !0), _this;
|
return _set((_assertThisInitialized(_this), _getPrototypeOf(SomeDerived2.prototype)), "privateMember", 1, _this, !0), _this;
|
||||||
}
|
}
|
||||||
return _createClass(SomeDerived2, [
|
return _createClass(SomeDerived2, [
|
||||||
{
|
{
|
||||||
|
@ -215,9 +215,9 @@ var c3 = /*#__PURE__*/ function(c2) {
|
|||||||
var _super = _createSuper(c3);
|
var _super = _createSuper(c3);
|
||||||
function c3() {
|
function c3() {
|
||||||
_classCallCheck(this, c3);
|
_classCallCheck(this, c3);
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
_this = _super.call(this, 10);
|
_this = _super.call(this, 10);
|
||||||
_this.p1 = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(c3.prototype)), "c2_p1", _thisSuper);
|
_this.p1 = _get((_assertThisInitialized(_this), _getPrototypeOf(c3.prototype)), "c2_p1", _this);
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
_createClass(c3, [
|
_createClass(c3, [
|
||||||
@ -309,9 +309,9 @@ var c6 = /*#__PURE__*/ function(c5) {
|
|||||||
var _super = _createSuper(c6);
|
var _super = _createSuper(c6);
|
||||||
function c6() {
|
function c6() {
|
||||||
_classCallCheck(this, c6);
|
_classCallCheck(this, c6);
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
_this = _super.call(this);
|
_this = _super.call(this);
|
||||||
_this.d = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(c6.prototype)), "b", _thisSuper);
|
_this.d = _get((_assertThisInitialized(_this), _getPrototypeOf(c6.prototype)), "b", _this);
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
return c6;
|
return c6;
|
||||||
|
@ -146,8 +146,8 @@ var c2 = function() {
|
|||||||
_inherits(c3, c2);
|
_inherits(c3, c2);
|
||||||
var _super = _createSuper(c3);
|
var _super = _createSuper(c3);
|
||||||
function c3() {
|
function c3() {
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
return _classCallCheck(this, c3), (_this = _super.call(this, 10)).p1 = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(c3.prototype)), "c2_p1", _thisSuper), _this;
|
return _classCallCheck(this, c3), (_this = _super.call(this, 10)).p1 = _get((_assertThisInitialized(_this), _getPrototypeOf(c3.prototype)), "c2_p1", _this), _this;
|
||||||
}
|
}
|
||||||
return _createClass(c3, [
|
return _createClass(c3, [
|
||||||
{
|
{
|
||||||
@ -191,8 +191,8 @@ var c5 = function() {
|
|||||||
_inherits(c6, c51);
|
_inherits(c6, c51);
|
||||||
var _super = _createSuper(c6);
|
var _super = _createSuper(c6);
|
||||||
function c6() {
|
function c6() {
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
return _classCallCheck(this, c6), (_this = _super.call(this)).d = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(c6.prototype)), "b", _thisSuper), _this;
|
return _classCallCheck(this, c6), (_this = _super.call(this)).d = _get((_assertThisInitialized(_this), _getPrototypeOf(c6.prototype)), "b", _this), _this;
|
||||||
}
|
}
|
||||||
return c6;
|
return c6;
|
||||||
}(c5);
|
}(c5);
|
||||||
|
@ -125,7 +125,6 @@ var C = /*#__PURE__*/ function(CBase) {
|
|||||||
var _super = _createSuper(C);
|
var _super = _createSuper(C);
|
||||||
function C() {
|
function C() {
|
||||||
_classCallCheck(this, C);
|
_classCallCheck(this, C);
|
||||||
var _thisSuper;
|
|
||||||
var _this = _super.call(this, {
|
var _this = _super.call(this, {
|
||||||
method: function method(p) {
|
method: function method(p) {
|
||||||
p.length;
|
p.length;
|
||||||
@ -133,7 +132,7 @@ var C = /*#__PURE__*/ function(CBase) {
|
|||||||
});
|
});
|
||||||
// Should be okay.
|
// Should be okay.
|
||||||
// 'p' should have type 'string'.
|
// 'p' should have type 'string'.
|
||||||
_get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "foo", _thisSuper).call(_thisSuper, {
|
_get((_assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "foo", _this).call(_this, {
|
||||||
method: function method(p) {
|
method: function method(p) {
|
||||||
p.length;
|
p.length;
|
||||||
}
|
}
|
||||||
|
@ -77,12 +77,12 @@ var CBase = function() {
|
|||||||
});
|
});
|
||||||
function C() {
|
function C() {
|
||||||
_classCallCheck(this, C);
|
_classCallCheck(this, C);
|
||||||
var _thisSuper, _this = _super.call(this, {
|
var _this = _super.call(this, {
|
||||||
method: function(p) {
|
method: function(p) {
|
||||||
p.length;
|
p.length;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "foo", _thisSuper).call(_thisSuper, {
|
return _get((_assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "foo", _this).call(_this, {
|
||||||
method: function(p) {
|
method: function(p) {
|
||||||
p.length;
|
p.length;
|
||||||
}
|
}
|
||||||
|
@ -147,9 +147,8 @@ var SomeDerivedClass = /*#__PURE__*/ function(SomeBaseClass) {
|
|||||||
var _super = _createSuper(SomeDerivedClass);
|
var _super = _createSuper(SomeDerivedClass);
|
||||||
function SomeDerivedClass() {
|
function SomeDerivedClass() {
|
||||||
_classCallCheck(this, SomeDerivedClass);
|
_classCallCheck(this, SomeDerivedClass);
|
||||||
var _thisSuper;
|
|
||||||
var _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
var x = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(SomeDerivedClass.prototype)), "func", _thisSuper).call(_thisSuper);
|
var x = _get((_assertThisInitialized(_this), _getPrototypeOf(SomeDerivedClass.prototype)), "func", _this).call(_this);
|
||||||
var x;
|
var x;
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
|
@ -94,8 +94,8 @@ var SomeBaseClass = function() {
|
|||||||
});
|
});
|
||||||
function SomeDerivedClass() {
|
function SomeDerivedClass() {
|
||||||
_classCallCheck(this, SomeDerivedClass);
|
_classCallCheck(this, SomeDerivedClass);
|
||||||
var _thisSuper, _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
return _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(SomeDerivedClass.prototype)), "func", _thisSuper).call(_thisSuper), _this;
|
return _get((_assertThisInitialized(_this), _getPrototypeOf(SomeDerivedClass.prototype)), "func", _this).call(_this), _this;
|
||||||
}
|
}
|
||||||
return _createClass(SomeDerivedClass, [
|
return _createClass(SomeDerivedClass, [
|
||||||
{
|
{
|
||||||
|
@ -134,12 +134,12 @@ var C = /*#__PURE__*/ function(B) {
|
|||||||
var _super = _createSuper(C);
|
var _super = _createSuper(C);
|
||||||
function C() {
|
function C() {
|
||||||
_classCallCheck(this, C);
|
_classCallCheck(this, C);
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
_this = _super.apply(this, arguments);
|
_this = _super.apply(this, arguments);
|
||||||
// these should be unaffected
|
// these should be unaffected
|
||||||
_this.x = 1;
|
_this.x = 1;
|
||||||
_this.y = _this.x;
|
_this.y = _this.x;
|
||||||
_this.z = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _thisSuper).call(_thisSuper);
|
_this.z = _get((_assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _this).call(_this);
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
return C;
|
return C;
|
||||||
|
@ -76,10 +76,10 @@ var ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, ref8, _tmp, C = function(B) {
|
|||||||
return self = this, (call = result) && ("object" == ((obj = call) && "undefined" != typeof Symbol && obj.constructor === Symbol ? "symbol" : typeof obj) || "function" == typeof call) ? call : _assertThisInitialized(self);
|
return self = this, (call = result) && ("object" == ((obj = call) && "undefined" != typeof Symbol && obj.constructor === Symbol ? "symbol" : typeof obj) || "function" == typeof call) ? call : _assertThisInitialized(self);
|
||||||
});
|
});
|
||||||
function C() {
|
function C() {
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
return !function(instance, Constructor) {
|
return !function(instance, Constructor) {
|
||||||
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
|
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
|
||||||
}(this, C), _this = _super.apply(this, arguments), _this.x = 1, _this.y = _this.x, _this.z = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _thisSuper).call(_thisSuper), _this;
|
}(this, C), _this = _super.apply(this, arguments), _this.x = 1, _this.y = _this.x, _this.z = _get((_assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _this).call(_this), _this;
|
||||||
}
|
}
|
||||||
return C;
|
return C;
|
||||||
}(B);
|
}(B);
|
||||||
|
@ -134,12 +134,12 @@ var C = /*#__PURE__*/ function(B) {
|
|||||||
var _super = _createSuper(C);
|
var _super = _createSuper(C);
|
||||||
function C() {
|
function C() {
|
||||||
_classCallCheck(this, C);
|
_classCallCheck(this, C);
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
_this = _super.apply(this, arguments);
|
_this = _super.apply(this, arguments);
|
||||||
// these should be unaffected
|
// these should be unaffected
|
||||||
_this.x = 1;
|
_this.x = 1;
|
||||||
_this.y = _this.x;
|
_this.y = _this.x;
|
||||||
_this.z = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _thisSuper).call(_thisSuper);
|
_this.z = _get((_assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _this).call(_this);
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
return C;
|
return C;
|
||||||
|
@ -76,10 +76,10 @@ var ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, ref8, _tmp, C = function(B) {
|
|||||||
return self = this, (call = result) && ("object" == ((obj = call) && "undefined" != typeof Symbol && obj.constructor === Symbol ? "symbol" : typeof obj) || "function" == typeof call) ? call : _assertThisInitialized(self);
|
return self = this, (call = result) && ("object" == ((obj = call) && "undefined" != typeof Symbol && obj.constructor === Symbol ? "symbol" : typeof obj) || "function" == typeof call) ? call : _assertThisInitialized(self);
|
||||||
});
|
});
|
||||||
function C() {
|
function C() {
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
return !function(instance, Constructor) {
|
return !function(instance, Constructor) {
|
||||||
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
|
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
|
||||||
}(this, C), _this = _super.apply(this, arguments), _this.x = 1, _this.y = _this.x, _this.z = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _thisSuper).call(_thisSuper), _this;
|
}(this, C), _this = _super.apply(this, arguments), _this.x = 1, _this.y = _this.x, _this.z = _get((_assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _this).call(_this), _this;
|
||||||
}
|
}
|
||||||
return C;
|
return C;
|
||||||
}(B);
|
}(B);
|
||||||
|
@ -99,12 +99,12 @@ var C = /*#__PURE__*/ function(B) {
|
|||||||
var _super = _createSuper(C);
|
var _super = _createSuper(C);
|
||||||
function C() {
|
function C() {
|
||||||
_classCallCheck(this, C);
|
_classCallCheck(this, C);
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
_this = _super.apply(this, arguments);
|
_this = _super.apply(this, arguments);
|
||||||
// these should be unaffected
|
// these should be unaffected
|
||||||
_this.x = 1;
|
_this.x = 1;
|
||||||
_this.y = _this.x;
|
_this.y = _this.x;
|
||||||
_this.z = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _thisSuper).call(_thisSuper);
|
_this.z = _get((_assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _this).call(_this);
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
return C;
|
return C;
|
||||||
|
@ -55,10 +55,10 @@ var ref, ref1, C = function(B) {
|
|||||||
return self = this, (call = result) && ("object" == ((obj = call) && "undefined" != typeof Symbol && obj.constructor === Symbol ? "symbol" : typeof obj) || "function" == typeof call) ? call : _assertThisInitialized(self);
|
return self = this, (call = result) && ("object" == ((obj = call) && "undefined" != typeof Symbol && obj.constructor === Symbol ? "symbol" : typeof obj) || "function" == typeof call) ? call : _assertThisInitialized(self);
|
||||||
});
|
});
|
||||||
function C() {
|
function C() {
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
return !function(instance, Constructor) {
|
return !function(instance, Constructor) {
|
||||||
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
|
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
|
||||||
}(this, C), _this = _super.apply(this, arguments), _this.x = 1, _this.y = _this.x, _this.z = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _thisSuper).call(_thisSuper), _this;
|
}(this, C), _this = _super.apply(this, arguments), _this.x = 1, _this.y = _this.x, _this.z = _get((_assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _this).call(_this), _this;
|
||||||
}
|
}
|
||||||
return C;
|
return C;
|
||||||
}(B);
|
}(B);
|
||||||
|
@ -99,12 +99,12 @@ var C = /*#__PURE__*/ function(B) {
|
|||||||
var _super = _createSuper(C);
|
var _super = _createSuper(C);
|
||||||
function C() {
|
function C() {
|
||||||
_classCallCheck(this, C);
|
_classCallCheck(this, C);
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
_this = _super.apply(this, arguments);
|
_this = _super.apply(this, arguments);
|
||||||
// these should be unaffected
|
// these should be unaffected
|
||||||
_this.x = 1;
|
_this.x = 1;
|
||||||
_this.y = _this.x;
|
_this.y = _this.x;
|
||||||
_this.z = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _thisSuper).call(_thisSuper);
|
_this.z = _get((_assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _this).call(_this);
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
return C;
|
return C;
|
||||||
|
@ -55,10 +55,10 @@ var ref, ref1, C = function(B) {
|
|||||||
return self = this, (call = result) && ("object" == ((obj = call) && "undefined" != typeof Symbol && obj.constructor === Symbol ? "symbol" : typeof obj) || "function" == typeof call) ? call : _assertThisInitialized(self);
|
return self = this, (call = result) && ("object" == ((obj = call) && "undefined" != typeof Symbol && obj.constructor === Symbol ? "symbol" : typeof obj) || "function" == typeof call) ? call : _assertThisInitialized(self);
|
||||||
});
|
});
|
||||||
function C() {
|
function C() {
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
return !function(instance, Constructor) {
|
return !function(instance, Constructor) {
|
||||||
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
|
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
|
||||||
}(this, C), _this = _super.apply(this, arguments), _this.x = 1, _this.y = _this.x, _this.z = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _thisSuper).call(_thisSuper), _this;
|
}(this, C), _this = _super.apply(this, arguments), _this.x = 1, _this.y = _this.x, _this.z = _get((_assertThisInitialized(_this), _getPrototypeOf(C.prototype)), "f", _this).call(_this), _this;
|
||||||
}
|
}
|
||||||
return C;
|
return C;
|
||||||
}(B);
|
}(B);
|
||||||
|
@ -739,7 +739,6 @@ impl Take for ParenExpr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[ast_node]
|
#[ast_node]
|
||||||
#[allow(variant_size_differences)]
|
|
||||||
#[derive(Eq, Hash, Is, EqIgnoreSpan)]
|
#[derive(Eq, Hash, Is, EqIgnoreSpan)]
|
||||||
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
|
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
|
||||||
pub enum Callee {
|
pub enum Callee {
|
||||||
|
@ -69,12 +69,12 @@ impl<'a> VisitMut for SuperFieldAccessFolder<'a> {
|
|||||||
fn visit_mut_expr(&mut self, n: &mut Expr) {
|
fn visit_mut_expr(&mut self, n: &mut Expr) {
|
||||||
match n {
|
match n {
|
||||||
Expr::This(ThisExpr { span }) if self.in_nested_scope => {
|
Expr::This(ThisExpr { span }) if self.in_nested_scope => {
|
||||||
if self.this_alias_mark.is_none() {
|
|
||||||
self.this_alias_mark = Some(Mark::fresh(Mark::root()));
|
|
||||||
}
|
|
||||||
|
|
||||||
*n = Expr::Ident(quote_ident!(
|
*n = Expr::Ident(quote_ident!(
|
||||||
span.apply_mark(self.this_alias_mark.unwrap()),
|
span.apply_mark(
|
||||||
|
*self
|
||||||
|
.this_alias_mark
|
||||||
|
.get_or_insert_with(|| Mark::fresh(Mark::root()))
|
||||||
|
),
|
||||||
"_this"
|
"_this"
|
||||||
));
|
));
|
||||||
return;
|
return;
|
||||||
@ -149,7 +149,7 @@ impl<'a> SuperFieldAccessFolder<'a> {
|
|||||||
..
|
..
|
||||||
}) = &**callee_expr
|
}) = &**callee_expr
|
||||||
{
|
{
|
||||||
let this = match self.constructor_this_mark {
|
let this = match self.this_alias_mark.or(self.constructor_this_mark) {
|
||||||
Some(mark) => quote_ident!(DUMMY_SP.apply_mark(mark), "_this").as_arg(),
|
Some(mark) => quote_ident!(DUMMY_SP.apply_mark(mark), "_this").as_arg(),
|
||||||
_ => ThisExpr { span: DUMMY_SP }.as_arg(),
|
_ => ThisExpr { span: DUMMY_SP }.as_arg(),
|
||||||
};
|
};
|
||||||
@ -286,7 +286,7 @@ impl<'a> SuperFieldAccessFolder<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn super_to_get_call(&mut self, super_token: Span, prop: SuperProp) -> Expr {
|
fn super_to_get_call(&mut self, super_token: Span, prop: SuperProp) -> Expr {
|
||||||
let proto_arg = get_prototype_of(if self.is_static {
|
let mut proto_arg = get_prototype_of(if self.is_static {
|
||||||
// Foo
|
// Foo
|
||||||
Expr::Ident(self.class_name.clone())
|
Expr::Ident(self.class_name.clone())
|
||||||
} else {
|
} else {
|
||||||
@ -294,8 +294,25 @@ impl<'a> SuperFieldAccessFolder<'a> {
|
|||||||
self.class_name
|
self.class_name
|
||||||
.clone()
|
.clone()
|
||||||
.make_member(quote_ident!("prototype"))
|
.make_member(quote_ident!("prototype"))
|
||||||
})
|
});
|
||||||
.as_arg();
|
|
||||||
|
if let Some(mark) = self.constructor_this_mark {
|
||||||
|
let this = quote_ident!(DUMMY_SP.apply_mark(mark), "_this");
|
||||||
|
|
||||||
|
proto_arg = Expr::Seq(SeqExpr {
|
||||||
|
span: DUMMY_SP,
|
||||||
|
exprs: vec![
|
||||||
|
Expr::Call(CallExpr {
|
||||||
|
span: DUMMY_SP,
|
||||||
|
callee: helper!(assert_this_initialized, "assertThisInitialized"),
|
||||||
|
args: vec![this.as_arg()],
|
||||||
|
type_args: Default::default(),
|
||||||
|
})
|
||||||
|
.into(),
|
||||||
|
proto_arg.into(),
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
let prop_arg = match prop {
|
let prop_arg = match prop {
|
||||||
SuperProp::Ident(Ident {
|
SuperProp::Ident(Ident {
|
||||||
@ -311,24 +328,14 @@ impl<'a> SuperFieldAccessFolder<'a> {
|
|||||||
.as_arg();
|
.as_arg();
|
||||||
|
|
||||||
let this_arg = match self.constructor_this_mark {
|
let this_arg = match self.constructor_this_mark {
|
||||||
Some(mark) => {
|
Some(mark) => quote_ident!(super_token.apply_mark(mark), "_this").as_arg(),
|
||||||
let this = quote_ident!(super_token.apply_mark(mark), "_this");
|
|
||||||
|
|
||||||
CallExpr {
|
|
||||||
span: DUMMY_SP,
|
|
||||||
callee: helper!(assert_this_initialized, "assertThisInitialized"),
|
|
||||||
args: vec![this.as_arg()],
|
|
||||||
type_args: Default::default(),
|
|
||||||
}
|
|
||||||
.as_arg()
|
|
||||||
}
|
|
||||||
None => ThisExpr { span: super_token }.as_arg(),
|
None => ThisExpr { span: super_token }.as_arg(),
|
||||||
};
|
};
|
||||||
|
|
||||||
Expr::Call(CallExpr {
|
Expr::Call(CallExpr {
|
||||||
span: super_token,
|
span: super_token,
|
||||||
callee: helper!(get, "get"),
|
callee: helper!(get, "get"),
|
||||||
args: vec![proto_arg, prop_arg, this_arg],
|
args: vec![proto_arg.as_arg(), prop_arg, this_arg],
|
||||||
type_args: Default::default(),
|
type_args: Default::default(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -366,12 +373,29 @@ impl<'a> SuperFieldAccessFolder<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let proto_arg = get_prototype_of(
|
let mut proto_arg = get_prototype_of(
|
||||||
self.class_name
|
self.class_name
|
||||||
.clone()
|
.clone()
|
||||||
.make_member(quote_ident!("prototype")),
|
.make_member(quote_ident!("prototype")),
|
||||||
)
|
);
|
||||||
.as_arg();
|
|
||||||
|
if let Some(mark) = self.constructor_this_mark {
|
||||||
|
let this = quote_ident!(DUMMY_SP.apply_mark(mark), "_this");
|
||||||
|
|
||||||
|
proto_arg = Expr::Seq(SeqExpr {
|
||||||
|
span: DUMMY_SP,
|
||||||
|
exprs: vec![
|
||||||
|
Expr::Call(CallExpr {
|
||||||
|
span: DUMMY_SP,
|
||||||
|
callee: helper!(assert_this_initialized, "assertThisInitialized"),
|
||||||
|
args: vec![this.as_arg()],
|
||||||
|
type_args: Default::default(),
|
||||||
|
})
|
||||||
|
.into(),
|
||||||
|
proto_arg.into(),
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
let prop_arg = match prop {
|
let prop_arg = match prop {
|
||||||
SuperProp::Ident(Ident {
|
SuperProp::Ident(Ident {
|
||||||
@ -433,13 +457,16 @@ impl<'a> SuperFieldAccessFolder<'a> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let this_arg = ThisExpr { span: super_token }.as_arg();
|
let this_arg = match self.constructor_this_mark {
|
||||||
|
Some(mark) => quote_ident!(super_token.apply_mark(mark), "_this").as_arg(),
|
||||||
|
None => ThisExpr { span: super_token }.as_arg(),
|
||||||
|
};
|
||||||
|
|
||||||
let expr = Expr::Call(CallExpr {
|
let expr = Expr::Call(CallExpr {
|
||||||
span: super_token,
|
span: super_token,
|
||||||
callee: helper!(set, "set"),
|
callee: helper!(set, "set"),
|
||||||
args: vec![
|
args: vec![
|
||||||
proto_arg,
|
proto_arg.as_arg(),
|
||||||
prop_arg,
|
prop_arg,
|
||||||
rhs_arg,
|
rhs_arg,
|
||||||
this_arg,
|
this_arg,
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
use swc_atoms::{js_word, JsWord};
|
use swc_atoms::JsWord;
|
||||||
use swc_common::{util::take::Take, Mark, DUMMY_SP};
|
use swc_common::{util::take::Take, Mark, DUMMY_SP};
|
||||||
use swc_ecma_ast::*;
|
use swc_ecma_ast::*;
|
||||||
use swc_ecma_transforms_base::helper;
|
use swc_ecma_transforms_base::helper;
|
||||||
use swc_ecma_transforms_classes::{get_prototype_of, visit_mut_only_key};
|
use swc_ecma_transforms_classes::{get_prototype_of, visit_mut_only_key};
|
||||||
use swc_ecma_utils::{private_ident, quote_ident, ExprFactory};
|
use swc_ecma_utils::{quote_ident, ExprFactory};
|
||||||
use swc_ecma_visit::{
|
use swc_ecma_visit::{
|
||||||
noop_visit_mut_type, noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith,
|
noop_visit_mut_type, noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith,
|
||||||
};
|
};
|
||||||
@ -44,10 +44,6 @@ impl SuperCallFinder {
|
|||||||
macro_rules! ignore_return {
|
macro_rules! ignore_return {
|
||||||
($name:ident, $T:ty) => {
|
($name:ident, $T:ty) => {
|
||||||
fn $name(&mut self, n: &mut $T) {
|
fn $name(&mut self, n: &mut $T) {
|
||||||
if self.in_injected_define_property_call {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let old = self.ignore_return;
|
let old = self.ignore_return;
|
||||||
self.ignore_return = true;
|
self.ignore_return = true;
|
||||||
n.visit_mut_children_with(self);
|
n.visit_mut_children_with(self);
|
||||||
@ -156,11 +152,6 @@ pub(super) fn constructor_fn(c: Constructor) -> Function {
|
|||||||
pub(super) struct ConstructorFolder<'a> {
|
pub(super) struct ConstructorFolder<'a> {
|
||||||
pub class_name: &'a Ident,
|
pub class_name: &'a Ident,
|
||||||
pub mode: Option<SuperFoldingMode>,
|
pub mode: Option<SuperFoldingMode>,
|
||||||
/// Variables named `thisSuper` will be added if `super.foo` or
|
|
||||||
/// `super.foo()` is used in constructor.
|
|
||||||
pub vars: &'a mut Vec<VarDeclarator>,
|
|
||||||
|
|
||||||
pub cur_this_super: Option<Ident>,
|
|
||||||
|
|
||||||
/// Mark for `_this`
|
/// Mark for `_this`
|
||||||
pub mark: Mark,
|
pub mark: Mark,
|
||||||
@ -168,132 +159,6 @@ pub(super) struct ConstructorFolder<'a> {
|
|||||||
pub super_var: Option<Ident>,
|
pub super_var: Option<Ident>,
|
||||||
/// True when recursing into other function or class.
|
/// True when recursing into other function or class.
|
||||||
pub ignore_return: bool,
|
pub ignore_return: bool,
|
||||||
pub in_injected_define_property_call: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ConstructorFolder<'_> {
|
|
||||||
/// `true` means it's processed and children are folded.
|
|
||||||
fn handle_super_assignment(&mut self, e: &mut Expr) -> bool {
|
|
||||||
if let Expr::Assign(AssignExpr {
|
|
||||||
left,
|
|
||||||
op: op!("="),
|
|
||||||
right,
|
|
||||||
span,
|
|
||||||
}) = e
|
|
||||||
{
|
|
||||||
let left = left.take().normalize_expr();
|
|
||||||
match left {
|
|
||||||
PatOrExpr::Expr(mut left_expr) => match *left_expr {
|
|
||||||
Expr::SuperProp(_) => {
|
|
||||||
right.visit_mut_children_with(self);
|
|
||||||
self.handle_super_access(&mut left_expr, Some(right.take()));
|
|
||||||
*e = *left_expr;
|
|
||||||
true
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
*e = Expr::Assign(AssignExpr {
|
|
||||||
span: *span,
|
|
||||||
left: PatOrExpr::Expr(left_expr),
|
|
||||||
op: op!("="),
|
|
||||||
right: right.take(),
|
|
||||||
});
|
|
||||||
false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
_ => {
|
|
||||||
*e = Expr::Assign(AssignExpr {
|
|
||||||
span: *span,
|
|
||||||
left,
|
|
||||||
op: op!("="),
|
|
||||||
right: right.take(),
|
|
||||||
});
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn handle_super_access(&mut self, e: &mut Expr, set_to: Option<Box<Expr>>) {
|
|
||||||
if let Expr::SuperProp(SuperPropExpr { span, prop, .. }) = e {
|
|
||||||
let this_var = quote_ident!(DUMMY_SP.apply_mark(self.mark), "_this");
|
|
||||||
let this_super = private_ident!("_thisSuper");
|
|
||||||
self.cur_this_super = Some(this_super.clone());
|
|
||||||
|
|
||||||
self.vars.push(VarDeclarator {
|
|
||||||
span: DUMMY_SP,
|
|
||||||
name: this_super.clone().into(),
|
|
||||||
init: None,
|
|
||||||
definite: Default::default(),
|
|
||||||
});
|
|
||||||
|
|
||||||
// _thisSuper = _assertThisInitialized(_this)
|
|
||||||
let init_this_super = Box::new(Expr::Assign(AssignExpr {
|
|
||||||
span: DUMMY_SP,
|
|
||||||
op: op!("="),
|
|
||||||
left: PatOrExpr::Pat(Box::new(this_super.clone().into())),
|
|
||||||
right: Box::new(Expr::Call(CallExpr {
|
|
||||||
span: DUMMY_SP,
|
|
||||||
callee: helper!(assert_this_initialized, "assertThisInitialized"),
|
|
||||||
args: vec![this_var.as_arg()],
|
|
||||||
type_args: Default::default(),
|
|
||||||
})),
|
|
||||||
}));
|
|
||||||
// _getPrototypeOf(Foo.prototype)
|
|
||||||
let get_proto = Box::new(Expr::Call(CallExpr {
|
|
||||||
span: *span,
|
|
||||||
callee: helper!(get_prototype_of, "getPrototypeOf"),
|
|
||||||
args: vec![self
|
|
||||||
.class_name
|
|
||||||
.clone()
|
|
||||||
.make_member(quote_ident!("prototype"))
|
|
||||||
.as_arg()],
|
|
||||||
type_args: Default::default(),
|
|
||||||
}));
|
|
||||||
|
|
||||||
*e = Expr::Call(CallExpr {
|
|
||||||
span: DUMMY_SP,
|
|
||||||
callee: if set_to.is_some() {
|
|
||||||
helper!(set, "set")
|
|
||||||
} else {
|
|
||||||
helper!(get, "get")
|
|
||||||
},
|
|
||||||
args: {
|
|
||||||
let mut args = vec![
|
|
||||||
Expr::Seq(SeqExpr {
|
|
||||||
span: DUMMY_SP,
|
|
||||||
exprs: vec![init_this_super, get_proto],
|
|
||||||
})
|
|
||||||
.as_arg(),
|
|
||||||
match prop {
|
|
||||||
SuperProp::Computed(ComputedPropName { expr, .. }) => {
|
|
||||||
expr.take().as_arg()
|
|
||||||
}
|
|
||||||
SuperProp::Ident(ident) => Str {
|
|
||||||
span: ident.span,
|
|
||||||
value: ident.take().sym,
|
|
||||||
has_escape: false,
|
|
||||||
kind: Default::default(),
|
|
||||||
}
|
|
||||||
.as_arg(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
let is_set = set_to.is_some();
|
|
||||||
args.extend(set_to.map(|v| v.as_arg()));
|
|
||||||
|
|
||||||
args.push(this_super.as_arg());
|
|
||||||
|
|
||||||
if is_set {
|
|
||||||
args.push(true.as_arg());
|
|
||||||
}
|
|
||||||
args
|
|
||||||
},
|
|
||||||
type_args: Default::default(),
|
|
||||||
})
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `None`: `return _possibleConstructorReturn`
|
/// `None`: `return _possibleConstructorReturn`
|
||||||
@ -310,125 +175,66 @@ impl VisitMut for ConstructorFolder<'_> {
|
|||||||
|
|
||||||
visit_mut_only_key!();
|
visit_mut_only_key!();
|
||||||
|
|
||||||
ignore_return!(visit_mut_function, Function);
|
|
||||||
|
|
||||||
ignore_return!(visit_mut_class, Class);
|
ignore_return!(visit_mut_class, Class);
|
||||||
|
|
||||||
ignore_return!(visit_mut_arrow_expr, ArrowExpr);
|
ignore_return!(visit_mut_arrow_expr, ArrowExpr);
|
||||||
|
|
||||||
ignore_return!(visit_mut_constructor, Constructor);
|
ignore_return!(visit_mut_constructor, Constructor);
|
||||||
|
|
||||||
fn visit_mut_call_expr(&mut self, e: &mut CallExpr) {
|
fn visit_mut_function(&mut self, _: &mut Function) {}
|
||||||
match &e.callee {
|
|
||||||
Callee::Expr(callee) => match &**callee {
|
|
||||||
Expr::SuperProp(_) => {
|
|
||||||
let old = self.cur_this_super.take();
|
|
||||||
|
|
||||||
e.visit_mut_children_with(self);
|
|
||||||
|
|
||||||
let this_super = self.cur_this_super.take().unwrap();
|
|
||||||
self.cur_this_super = old;
|
|
||||||
|
|
||||||
e.args.insert(0, this_super.as_arg());
|
|
||||||
e.callee = e
|
|
||||||
.callee
|
|
||||||
.take()
|
|
||||||
.expect_expr()
|
|
||||||
.make_member(quote_ident!("call"))
|
|
||||||
.as_callee();
|
|
||||||
}
|
|
||||||
|
|
||||||
_ => e.visit_mut_children_with(self),
|
|
||||||
},
|
|
||||||
|
|
||||||
_ => e.visit_mut_children_with(self),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_mut_expr(&mut self, expr: &mut Expr) {
|
fn visit_mut_expr(&mut self, expr: &mut Expr) {
|
||||||
match self.mode {
|
match self.mode {
|
||||||
Some(SuperFoldingMode::Assign) => {}
|
Some(SuperFoldingMode::Assign) => {}
|
||||||
_ => {
|
_ => {
|
||||||
if !self.handle_super_assignment(expr) {
|
expr.visit_mut_children_with(self);
|
||||||
expr.visit_mut_children_with(self);
|
|
||||||
};
|
|
||||||
self.handle_super_access(expr, None);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We pretend method folding mode for while folding injected `_defineProperty`
|
expr.visit_mut_children_with(self);
|
||||||
// calls.
|
|
||||||
if let Expr::Call(CallExpr {
|
if let Expr::Call(CallExpr {
|
||||||
callee: Callee::Expr(callee),
|
callee: Callee::Super(..),
|
||||||
|
args,
|
||||||
..
|
..
|
||||||
}) = expr
|
}) = expr
|
||||||
{
|
{
|
||||||
if let Expr::Ident(Ident {
|
let right = match self.super_var.clone() {
|
||||||
sym: js_word!("_defineProperty"),
|
Some(super_var) => Box::new(Expr::Call(CallExpr {
|
||||||
..
|
|
||||||
}) = &**callee
|
|
||||||
{
|
|
||||||
let old = self.in_injected_define_property_call;
|
|
||||||
self.in_injected_define_property_call = true;
|
|
||||||
expr.visit_mut_children_with(self);
|
|
||||||
self.in_injected_define_property_call = old;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !self.handle_super_assignment(expr) {
|
|
||||||
expr.visit_mut_children_with(self);
|
|
||||||
};
|
|
||||||
match expr {
|
|
||||||
Expr::This(e) => {
|
|
||||||
*expr = Expr::Ident(Ident::new("_this".into(), e.span.apply_mark(self.mark)))
|
|
||||||
}
|
|
||||||
Expr::Call(CallExpr {
|
|
||||||
callee: Callee::Super(..),
|
|
||||||
args,
|
|
||||||
..
|
|
||||||
}) => {
|
|
||||||
let right = match self.super_var.clone() {
|
|
||||||
Some(super_var) => Box::new(Expr::Call(CallExpr {
|
|
||||||
span: DUMMY_SP,
|
|
||||||
callee: if self.is_constructor_default {
|
|
||||||
super_var.make_member(quote_ident!("apply")).as_callee()
|
|
||||||
} else {
|
|
||||||
super_var.make_member(quote_ident!("call")).as_callee()
|
|
||||||
},
|
|
||||||
args: if self.is_constructor_default {
|
|
||||||
vec![
|
|
||||||
ThisExpr { span: DUMMY_SP }.as_arg(),
|
|
||||||
quote_ident!("arguments").as_arg(),
|
|
||||||
]
|
|
||||||
} else {
|
|
||||||
let mut call_args = vec![ThisExpr { span: DUMMY_SP }.as_arg()];
|
|
||||||
call_args.extend(args.take());
|
|
||||||
|
|
||||||
call_args
|
|
||||||
},
|
|
||||||
type_args: Default::default(),
|
|
||||||
})),
|
|
||||||
|
|
||||||
None => Box::new(make_possible_return_value(ReturningMode::Prototype {
|
|
||||||
class_name: self.class_name.clone(),
|
|
||||||
args: Some(args.take()),
|
|
||||||
is_constructor_default: self.is_constructor_default,
|
|
||||||
})),
|
|
||||||
};
|
|
||||||
|
|
||||||
*expr = Expr::Assign(AssignExpr {
|
|
||||||
span: DUMMY_SP,
|
span: DUMMY_SP,
|
||||||
left: PatOrExpr::Pat(
|
callee: if self.is_constructor_default {
|
||||||
quote_ident!(DUMMY_SP.apply_mark(self.mark), "_this").into(),
|
super_var.make_member(quote_ident!("apply")).as_callee()
|
||||||
),
|
} else {
|
||||||
op: op!("="),
|
super_var.make_member(quote_ident!("call")).as_callee()
|
||||||
right,
|
},
|
||||||
});
|
args: if self.is_constructor_default {
|
||||||
}
|
vec![
|
||||||
|
ThisExpr { span: DUMMY_SP }.as_arg(),
|
||||||
|
quote_ident!("arguments").as_arg(),
|
||||||
|
]
|
||||||
|
} else {
|
||||||
|
let mut call_args = vec![ThisExpr { span: DUMMY_SP }.as_arg()];
|
||||||
|
call_args.extend(args.take());
|
||||||
|
|
||||||
_ => self.handle_super_access(expr, None),
|
call_args
|
||||||
|
},
|
||||||
|
type_args: Default::default(),
|
||||||
|
})),
|
||||||
|
|
||||||
|
None => Box::new(make_possible_return_value(ReturningMode::Prototype {
|
||||||
|
class_name: self.class_name.clone(),
|
||||||
|
args: Some(args.take()),
|
||||||
|
is_constructor_default: self.is_constructor_default,
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
|
||||||
|
*expr = Expr::Assign(AssignExpr {
|
||||||
|
span: DUMMY_SP,
|
||||||
|
left: PatOrExpr::Pat(quote_ident!(DUMMY_SP.apply_mark(self.mark), "_this").into()),
|
||||||
|
op: op!("="),
|
||||||
|
right,
|
||||||
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -631,35 +437,17 @@ pub(super) fn replace_this_in_constructor(mark: Mark, c: &mut Constructor) -> bo
|
|||||||
mark: Mark,
|
mark: Mark,
|
||||||
found: bool,
|
found: bool,
|
||||||
wrap_with_assertion: bool,
|
wrap_with_assertion: bool,
|
||||||
in_injected_define_property_call: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl VisitMut for Replacer {
|
impl VisitMut for Replacer {
|
||||||
noop_visit_mut_type!();
|
noop_visit_mut_type!();
|
||||||
|
|
||||||
fn visit_mut_class(&mut self, _: &mut Class) {}
|
// let computed keys be visited
|
||||||
|
fn visit_mut_constructor(&mut self, _: &mut Constructor) {}
|
||||||
|
|
||||||
|
fn visit_mut_function(&mut self, _: &mut Function) {}
|
||||||
|
|
||||||
fn visit_mut_expr(&mut self, expr: &mut Expr) {
|
fn visit_mut_expr(&mut self, expr: &mut Expr) {
|
||||||
// We pretend method folding mode for while folding injected `_defineProperty`
|
|
||||||
// calls.
|
|
||||||
if let Expr::Call(CallExpr {
|
|
||||||
callee: Callee::Expr(callee),
|
|
||||||
..
|
|
||||||
}) = expr
|
|
||||||
{
|
|
||||||
if let Expr::Ident(Ident {
|
|
||||||
sym: js_word!("_defineProperty"),
|
|
||||||
..
|
|
||||||
}) = &**callee
|
|
||||||
{
|
|
||||||
let old = self.in_injected_define_property_call;
|
|
||||||
self.in_injected_define_property_call = true;
|
|
||||||
expr.visit_mut_children_with(self);
|
|
||||||
self.in_injected_define_property_call = old;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
match expr {
|
match expr {
|
||||||
Expr::This(..) => {
|
Expr::This(..) => {
|
||||||
self.found = true;
|
self.found = true;
|
||||||
@ -681,13 +469,6 @@ pub(super) fn replace_this_in_constructor(mark: Mark, c: &mut Constructor) -> bo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_mut_function(&mut self, n: &mut Function) {
|
|
||||||
if self.in_injected_define_property_call {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
n.visit_mut_children_with(self)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_mut_member_expr(&mut self, expr: &mut MemberExpr) {
|
fn visit_mut_member_expr(&mut self, expr: &mut MemberExpr) {
|
||||||
if self.mark != Mark::root() {
|
if self.mark != Mark::root() {
|
||||||
let old = self.wrap_with_assertion;
|
let old = self.wrap_with_assertion;
|
||||||
@ -704,9 +485,8 @@ pub(super) fn replace_this_in_constructor(mark: Mark, c: &mut Constructor) -> bo
|
|||||||
found: false,
|
found: false,
|
||||||
mark,
|
mark,
|
||||||
wrap_with_assertion: true,
|
wrap_with_assertion: true,
|
||||||
in_injected_define_property_call: false,
|
|
||||||
};
|
};
|
||||||
c.visit_mut_with(&mut v);
|
c.visit_mut_children_with(&mut v);
|
||||||
|
|
||||||
v.found
|
v.found
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ use tracing::debug;
|
|||||||
use self::{
|
use self::{
|
||||||
constructor::{
|
constructor::{
|
||||||
constructor_fn, make_possible_return_value, replace_this_in_constructor, ConstructorFolder,
|
constructor_fn, make_possible_return_value, replace_this_in_constructor, ConstructorFolder,
|
||||||
ReturningMode, SuperCallFinder, SuperFoldingMode, VarRenamer,
|
ReturningMode, SuperCallFinder, SuperFoldingMode,
|
||||||
},
|
},
|
||||||
prop_name::HashKey,
|
prop_name::HashKey,
|
||||||
};
|
};
|
||||||
@ -473,10 +473,11 @@ where
|
|||||||
constructor.unwrap_or_else(|| default_constructor(super_class_ident.is_some()));
|
constructor.unwrap_or_else(|| default_constructor(super_class_ident.is_some()));
|
||||||
|
|
||||||
// Rename variables to avoid conflicting with class name
|
// Rename variables to avoid conflicting with class name
|
||||||
constructor.body.visit_mut_with(&mut VarRenamer {
|
// TODO: bring it back once we have a proper private ident
|
||||||
mark: Mark::fresh(Mark::root()),
|
// constructor.body.visit_mut_with(&mut VarRenamer {
|
||||||
class_name: &class_name.sym,
|
// mark: Mark::fresh(Mark::root()),
|
||||||
});
|
// class_name: &class_name.sym,
|
||||||
|
// });
|
||||||
|
|
||||||
// Black magic to detect injected constructor.
|
// Black magic to detect injected constructor.
|
||||||
let is_constructor_default = constructor.span.is_dummy();
|
let is_constructor_default = constructor.span.is_dummy();
|
||||||
@ -529,14 +530,10 @@ where
|
|||||||
} else {
|
} else {
|
||||||
mode
|
mode
|
||||||
},
|
},
|
||||||
vars: &mut vars,
|
|
||||||
// This if expression is required to handle super() call in all case
|
|
||||||
cur_this_super: None,
|
|
||||||
mark: this_mark,
|
mark: this_mark,
|
||||||
is_constructor_default,
|
is_constructor_default,
|
||||||
super_var,
|
super_var,
|
||||||
ignore_return: false,
|
ignore_return: false,
|
||||||
in_injected_define_property_call: false,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
insert_this |= (mode == None && !is_always_initialized)
|
insert_this |= (mode == None && !is_always_initialized)
|
||||||
|
@ -831,14 +831,13 @@ class Test extends Foo {
|
|||||||
|
|
||||||
function Test() {
|
function Test() {
|
||||||
_classCallCheck(this, Test);
|
_classCallCheck(this, Test);
|
||||||
var _thisSuper, _thisSuper1;
|
|
||||||
|
|
||||||
var _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
|
|
||||||
|
_get((_assertThisInitialized(_this), _getPrototypeOf(Test.prototype)), "test", _this).whatever();
|
||||||
|
|
||||||
_get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(Test.prototype)), "test", _thisSuper).whatever();
|
_get((_assertThisInitialized(_this), _getPrototypeOf(Test.prototype)), "test", _this).call(_this);
|
||||||
|
|
||||||
_get((_thisSuper1 = _assertThisInitialized(_this), _getPrototypeOf(Test.prototype)), "test", _thisSuper1).call(_thisSuper1);
|
|
||||||
|
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1663,7 +1662,6 @@ var Outer = function (Hello) {
|
|||||||
var _super = _createSuper(Outer);
|
var _super = _createSuper(Outer);
|
||||||
function Outer() {
|
function Outer() {
|
||||||
_classCallCheck(this, Outer);
|
_classCallCheck(this, Outer);
|
||||||
var _thisSuper;
|
|
||||||
var _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
|
|
||||||
var Inner = /*#__PURE__*/function () {
|
var Inner = /*#__PURE__*/function () {
|
||||||
@ -1672,7 +1670,7 @@ var Outer = function (Hello) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_createClass(Inner, [{
|
_createClass(Inner, [{
|
||||||
key: _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(Outer.prototype)), "toString", _thisSuper).call(_thisSuper),
|
key: _get((_assertThisInitialized(_this), _getPrototypeOf(Outer.prototype)), "toString", _this).call(_this),
|
||||||
value: function () {
|
value: function () {
|
||||||
return 'hello';
|
return 'hello';
|
||||||
}
|
}
|
||||||
@ -1703,7 +1701,6 @@ class Foo extends Bar {
|
|||||||
super[super().method]();
|
super[super().method]();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
"#,
|
"#,
|
||||||
r#"
|
r#"
|
||||||
var Foo = /*#__PURE__*/function (Bar) {
|
var Foo = /*#__PURE__*/function (Bar) {
|
||||||
@ -1715,17 +1712,15 @@ class Foo extends Bar {
|
|||||||
function Foo() {
|
function Foo() {
|
||||||
_classCallCheck(this, Foo);
|
_classCallCheck(this, Foo);
|
||||||
|
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
|
|
||||||
_get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(Foo.prototype)), (_this = _super.call(this)).method, _thisSuper).call(_thisSuper);
|
_get((_assertThisInitialized(_this), _getPrototypeOf(Foo.prototype)), (_this = _super.call(this)).method, _this).call(_this);
|
||||||
|
|
||||||
return _possibleConstructorReturn(_this);
|
return _possibleConstructorReturn(_this);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Foo;
|
return Foo;
|
||||||
}(Bar);
|
}(Bar);
|
||||||
|
|
||||||
|
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1860,20 +1855,19 @@ class Test extends Foo {
|
|||||||
var Test = /*#__PURE__*/function (Foo) {
|
var Test = /*#__PURE__*/function (Foo) {
|
||||||
"use strict";
|
"use strict";
|
||||||
_inherits(Test, Foo);
|
_inherits(Test, Foo);
|
||||||
|
|
||||||
var _super = _createSuper(Test);
|
var _super = _createSuper(Test);
|
||||||
|
|
||||||
function Test() {
|
function Test() {
|
||||||
_classCallCheck(this, Test);
|
_classCallCheck(this, Test);
|
||||||
var _thisSuper, _thisSuper1;
|
|
||||||
var _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
|
|
||||||
_get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(Test.prototype)), "test", _thisSuper);
|
_get((_assertThisInitialized(_this), _getPrototypeOf(Test.prototype)), "test", _this);
|
||||||
|
|
||||||
_get((_thisSuper1 = _assertThisInitialized(_this), _getPrototypeOf(Test.prototype)), "test", _thisSuper1).whatever;
|
_get((_assertThisInitialized(_this), _getPrototypeOf(Test.prototype)), "test", _this).whatever;
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Test;
|
return Test;
|
||||||
}(Foo);
|
}(Foo);
|
||||||
|
|
||||||
@ -2205,16 +2199,16 @@ var _super = _createSuper(ColorPoint);
|
|||||||
function ColorPoint() {
|
function ColorPoint() {
|
||||||
_classCallCheck(this, ColorPoint);
|
_classCallCheck(this, ColorPoint);
|
||||||
|
|
||||||
var _thisSuper, _thisSuper1, _this;
|
var _this;
|
||||||
|
|
||||||
_this = _super.call(this);
|
_this = _super.call(this);
|
||||||
_this.x = 2;
|
_this.x = 2;
|
||||||
|
|
||||||
_set((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(ColorPoint.prototype)), "x", 3, _thisSuper, true);
|
_set((_assertThisInitialized(_this), _getPrototypeOf(ColorPoint.prototype)), "x", 3, _this, true);
|
||||||
|
|
||||||
expect(_this.x).toBe(3); // A
|
expect(_this.x).toBe(3); // A
|
||||||
|
|
||||||
expect(_get((_thisSuper1 = _assertThisInitialized(_this), _getPrototypeOf(ColorPoint.prototype)), "x", _thisSuper1)).toBeUndefined(); // B
|
expect(_get((_assertThisInitialized(_this), _getPrototypeOf(ColorPoint.prototype)), "x", _this)).toBeUndefined(); // B
|
||||||
|
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
@ -3741,10 +3735,9 @@ function (Hello) {
|
|||||||
var _super = _createSuper(Outer);
|
var _super = _createSuper(Outer);
|
||||||
function Outer() {
|
function Outer() {
|
||||||
_classCallCheck(this, Outer);
|
_classCallCheck(this, Outer);
|
||||||
var _thisSuper;
|
|
||||||
var _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
var Inner = {
|
var Inner = {
|
||||||
[_get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(Outer.prototype)), "toString", _thisSuper).call(_thisSuper)] () {
|
[_get((_assertThisInitialized(_this), _getPrototypeOf(Outer.prototype)), "toString", _this).call(_this)] () {
|
||||||
return 'hello';
|
return 'hello';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3760,6 +3753,59 @@ expect(new Outer().hello()).toBe('hello');
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
test!(
|
||||||
|
syntax(),
|
||||||
|
|t| tr(t),
|
||||||
|
nested_this_in_key,
|
||||||
|
r#"
|
||||||
|
class Outer extends B {
|
||||||
|
constructor() {
|
||||||
|
class Inner {
|
||||||
|
[this]() {
|
||||||
|
return 'hello';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function foo() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Inner();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
let Outer = function(B) {
|
||||||
|
"use strict";
|
||||||
|
_inherits(Outer, B);
|
||||||
|
var _super = _createSuper(Outer);
|
||||||
|
function Outer() {
|
||||||
|
_classCallCheck(this, Outer);
|
||||||
|
var _this;
|
||||||
|
let Inner = function() {
|
||||||
|
function Inner() {
|
||||||
|
_classCallCheck(this, Inner);
|
||||||
|
}
|
||||||
|
_createClass(Inner, [
|
||||||
|
{
|
||||||
|
key: _assertThisInitialized(_this),
|
||||||
|
value: function () {
|
||||||
|
return 'hello';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
return Inner;
|
||||||
|
}();
|
||||||
|
function foo() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
return _possibleConstructorReturn(_this, new Inner());
|
||||||
|
}
|
||||||
|
return Outer;
|
||||||
|
}(B);
|
||||||
|
"#
|
||||||
|
);
|
||||||
|
|
||||||
// get_set_set_semantics_not_defined_on_parent_setter_on_obj_exec
|
// get_set_set_semantics_not_defined_on_parent_setter_on_obj_exec
|
||||||
test_exec!(
|
test_exec!(
|
||||||
syntax(),
|
syntax(),
|
||||||
@ -4905,6 +4951,40 @@ test!(
|
|||||||
}"
|
}"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
test!(
|
||||||
|
syntax(),
|
||||||
|
|t| chain!(resolver(), classes(Some(t.comments.clone()))),
|
||||||
|
duplicate_ident,
|
||||||
|
r#"
|
||||||
|
class Foo extends Bar {
|
||||||
|
constructor() {
|
||||||
|
var Foo = 123;
|
||||||
|
console.log(Foo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
let Foo = /*#__PURE__*/function (Bar) {
|
||||||
|
"use strict";
|
||||||
|
_inherits(Foo, Bar);
|
||||||
|
|
||||||
|
var _super = _createSuper(Foo);
|
||||||
|
|
||||||
|
function Foo() {
|
||||||
|
_classCallCheck(this, Foo);
|
||||||
|
var _this;
|
||||||
|
|
||||||
|
var Foo1 = 123;
|
||||||
|
console.log(Foo1)
|
||||||
|
|
||||||
|
return _possibleConstructorReturn(_this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Foo;
|
||||||
|
}(Bar);
|
||||||
|
"#
|
||||||
|
);
|
||||||
|
|
||||||
//// regression_3028
|
//// regression_3028
|
||||||
//test!(
|
//test!(
|
||||||
// syntax(),
|
// syntax(),
|
||||||
@ -6327,6 +6407,36 @@ test!(
|
|||||||
"
|
"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
test!(
|
||||||
|
syntax(),
|
||||||
|
|t| classes(Some(t.comments.clone())),
|
||||||
|
constructor_super_update,
|
||||||
|
"
|
||||||
|
class A extends B{
|
||||||
|
constructor() {
|
||||||
|
super.foo ++;
|
||||||
|
super.bar += 123;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
",
|
||||||
|
r#"
|
||||||
|
let A = function(B) {
|
||||||
|
"use strict";
|
||||||
|
_inherits(A, B);
|
||||||
|
var _super = _createSuper(A);
|
||||||
|
function A() {
|
||||||
|
_classCallCheck(this, A);
|
||||||
|
var _ref, _superRef, _ref1;
|
||||||
|
var _this;
|
||||||
|
_set((_assertThisInitialized(_this), _getPrototypeOf(A.prototype)), _ref = "foo", (_superRef = +_get((_assertThisInitialized(_this), _getPrototypeOf(A.prototype)), _ref, _this)) + 1, _this, true), _superRef;
|
||||||
|
_set((_assertThisInitialized(_this), _getPrototypeOf(A.prototype)), _ref1 = "bar", _get((_assertThisInitialized(_this), _getPrototypeOf(A.prototype)), _ref1, _this) + 123, _this, true);
|
||||||
|
return _possibleConstructorReturn(_this);
|
||||||
|
}
|
||||||
|
return A;
|
||||||
|
}(B);
|
||||||
|
"#
|
||||||
|
);
|
||||||
|
|
||||||
test!(
|
test!(
|
||||||
syntax(),
|
syntax(),
|
||||||
|t| classes(Some(t.comments.clone())),
|
|t| classes(Some(t.comments.clone())),
|
||||||
|
@ -923,12 +923,11 @@ function (A) {
|
|||||||
var _super = _createSuper(B);
|
var _super = _createSuper(B);
|
||||||
function B() {
|
function B() {
|
||||||
_classCallCheck(this, B);
|
_classCallCheck(this, B);
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
|
|
||||||
_this = _super.apply(this, arguments);
|
_this = _super.apply(this, arguments);
|
||||||
_defineProperty(_assertThisInitialized(_this), 'foo', _get((_thisSuper = \
|
_defineProperty(_assertThisInitialized(_this), 'foo', _get((_assertThisInitialized(_this), \
|
||||||
_assertThisInitialized(_this), _getPrototypeOf(B.prototype)), 'foo', \
|
_getPrototypeOf(B.prototype)), 'foo', _this).call(_this));
|
||||||
_thisSuper).call(_thisSuper));
|
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1812,13 +1811,13 @@ function (A) {
|
|||||||
var _super = _createSuper(B);
|
var _super = _createSuper(B);
|
||||||
function B() {
|
function B() {
|
||||||
_classCallCheck(this, B);
|
_classCallCheck(this, B);
|
||||||
var _thisSuper, _this;
|
var _this;
|
||||||
|
|
||||||
_this = _super.apply(this, arguments);
|
_this = _super.apply(this, arguments);
|
||||||
|
|
||||||
_foo.set(_assertThisInitialized(_this), {
|
_foo.set(_assertThisInitialized(_this), {
|
||||||
writable: true,
|
writable: true,
|
||||||
value: _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(B.prototype)), "foo", _thisSuper).call(_thisSuper)
|
value: _get((_assertThisInitialized(_this), _getPrototypeOf(B.prototype)), "foo", _this).call(_this)
|
||||||
});
|
});
|
||||||
|
|
||||||
return _this;
|
return _this;
|
||||||
@ -1930,10 +1929,9 @@ var Outer = function (Hello) {
|
|||||||
var _super = _createSuper(Outer);
|
var _super = _createSuper(Outer);
|
||||||
function Outer() {
|
function Outer() {
|
||||||
_classCallCheck(this, Outer);
|
_classCallCheck(this, Outer);
|
||||||
var _thisSuper;
|
|
||||||
var _this = _super.call(this);
|
var _this = _super.call(this);
|
||||||
|
|
||||||
var _ref = _get((_thisSuper = _assertThisInitialized(_this), _getPrototypeOf(Outer.prototype)), "toString", _thisSuper).call(_thisSuper);
|
var _ref = _get((_assertThisInitialized(_this), _getPrototypeOf(Outer.prototype)), "toString", _this).call(_this);
|
||||||
|
|
||||||
var Inner = function Inner() {
|
var Inner = function Inner() {
|
||||||
_classCallCheck(this, Inner);
|
_classCallCheck(this, Inner);
|
||||||
|
Loading…
Reference in New Issue
Block a user