Fix super nested class bugs (#7691)
* Properly traverse nested class for supers * Add object nested in class cases * Add object nested object cases * Test class properties * Undo changes to lerna.json * Add tests arournd prefix/postfix super increment * tmp * Use sets
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
const Hello = {
|
||||
toString() {
|
||||
return 'hello';
|
||||
}
|
||||
};
|
||||
|
||||
const Outer = {
|
||||
constructor() {
|
||||
class Inner {
|
||||
[super.toString()]() {
|
||||
return 'hello';
|
||||
}
|
||||
}
|
||||
|
||||
return new Inner();
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(Outer, Hello);
|
||||
|
||||
assert.equal(Outer.constructor().hello(), 'hello');
|
||||
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
const Hello = {
|
||||
toString() {
|
||||
return 'hello';
|
||||
}
|
||||
};
|
||||
|
||||
const Outer = {
|
||||
constructor() {
|
||||
class Inner {
|
||||
[super.toString()]() {
|
||||
return 'hello';
|
||||
}
|
||||
}
|
||||
|
||||
return new Inner();
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(Outer, Hello);
|
||||
|
||||
assert.equal(Outer.constructor().hello(), 'hello');
|
||||
@@ -0,0 +1,23 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
const Hello = {
|
||||
toString: function () {
|
||||
return 'hello';
|
||||
}
|
||||
};
|
||||
const Outer = _obj = {
|
||||
constructor: function () {
|
||||
class Inner {
|
||||
[babelHelpers.get(babelHelpers.getPrototypeOf(_obj), "toString", this).call(this)]() {
|
||||
return 'hello';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return new Inner();
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(Outer, Hello);
|
||||
assert.equal(Outer.constructor().hello(), 'hello');
|
||||
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
const Hello = {
|
||||
toString() {
|
||||
return 'hello';
|
||||
}
|
||||
};
|
||||
|
||||
const Outer = {
|
||||
constructor() {
|
||||
const Inner = {
|
||||
[super.toString()]() {
|
||||
return 'hello';
|
||||
},
|
||||
};
|
||||
|
||||
return Inner;
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(Outer, Hello);
|
||||
|
||||
assert.equal(Outer.constructor().hello(), 'hello');
|
||||
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
const Hello = {
|
||||
toString() {
|
||||
return 'hello';
|
||||
}
|
||||
};
|
||||
|
||||
const Outer = {
|
||||
constructor() {
|
||||
const Inner = {
|
||||
[super.toString()]() {
|
||||
return 'hello';
|
||||
},
|
||||
};
|
||||
|
||||
return Inner;
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(Outer, Hello);
|
||||
|
||||
assert.equal(Outer.constructor().hello(), 'hello');
|
||||
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
const Hello = {
|
||||
toString: function () {
|
||||
return 'hello';
|
||||
}
|
||||
};
|
||||
const Outer = _obj = {
|
||||
constructor: function () {
|
||||
const Inner = {
|
||||
[babelHelpers.get(babelHelpers.getPrototypeOf(_obj), "toString", this).call(this)]: function () {
|
||||
return 'hello';
|
||||
}
|
||||
};
|
||||
return Inner;
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(Outer, Hello);
|
||||
assert.equal(Outer.constructor().hello(), 'hello');
|
||||
@@ -1,13 +1,13 @@
|
||||
var _obj;
|
||||
|
||||
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
var Base = {
|
||||
test: '1',
|
||||
};
|
||||
|
||||
var obj = {
|
||||
bar() {
|
||||
return super.test++;
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.strictEqual(obj.bar(), 1);
|
||||
assert.strictEqual(Base.test, '1');
|
||||
// TODO(jridgewell): Post #7687, uncomment this.
|
||||
// assert.strictEqual(obj.test, 2);
|
||||
@@ -0,0 +1,14 @@
|
||||
var Base = {
|
||||
test: '1',
|
||||
};
|
||||
|
||||
var obj = {
|
||||
bar() {
|
||||
return super.test++;
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.strictEqual(obj.bar(), 1);
|
||||
assert.strictEqual(Base.test, '1');
|
||||
assert.strictEqual(obj.test, 2);
|
||||
@@ -0,0 +1,16 @@
|
||||
var _obj;
|
||||
|
||||
var Base = {
|
||||
test: '1'
|
||||
};
|
||||
var obj = _obj = {
|
||||
bar: function () {
|
||||
var _ref;
|
||||
|
||||
return _ref = Number(babelHelpers.get(babelHelpers.getPrototypeOf(_obj), "test", this)), babelHelpers.set(babelHelpers.getPrototypeOf(_obj), "test", _ref + 1, this, false), _ref;
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.strictEqual(obj.bar(), 1);
|
||||
assert.strictEqual(Base.test, '1');
|
||||
assert.strictEqual(obj.test, 2);
|
||||
@@ -0,0 +1,15 @@
|
||||
var Base = {
|
||||
test: '1',
|
||||
};
|
||||
|
||||
var obj = {
|
||||
bar() {
|
||||
return ++super.test;
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.strictEqual(obj.bar(), 2);
|
||||
assert.strictEqual(Base.test, '1');
|
||||
// TODO(jridgewell): Post #7687, uncomment this.
|
||||
// assert.strictEqual(obj.test, 2);
|
||||
@@ -0,0 +1,14 @@
|
||||
var Base = {
|
||||
test: '1',
|
||||
};
|
||||
|
||||
var obj = {
|
||||
bar() {
|
||||
return ++super.test;
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.strictEqual(obj.bar(), 2);
|
||||
assert.strictEqual(Base.test, '1');
|
||||
assert.strictEqual(obj.test, 2);
|
||||
@@ -0,0 +1,16 @@
|
||||
var _obj;
|
||||
|
||||
var Base = {
|
||||
test: '1'
|
||||
};
|
||||
var obj = _obj = {
|
||||
bar: function () {
|
||||
var _ref;
|
||||
|
||||
return _ref = Number(babelHelpers.get(babelHelpers.getPrototypeOf(_obj), "test", this)), babelHelpers.set(babelHelpers.getPrototypeOf(_obj), "test", _ref + 1, this, false);
|
||||
}
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.strictEqual(obj.bar(), 2);
|
||||
assert.strictEqual(Base.test, '1');
|
||||
assert.strictEqual(obj.test, 2);
|
||||
Reference in New Issue
Block a user