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:
Justin Ridgewell
2018-04-12 13:02:26 -04:00
committed by GitHub
parent af3d6526e7
commit ecbf0dd53c
37 changed files with 907 additions and 169 deletions

View File

@@ -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');

View File

@@ -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');

View File

@@ -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');

View File

@@ -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');

View File

@@ -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');

View File

@@ -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');

View File

@@ -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); }

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);