Class Private Static Accessors (#10217)

* Remove error for static private accessors

* Private static accessors strict

* Add loose mode support

* Move `value` decl for early return

* Reuse getter/setter template

* Reuse getter/setter templates

* Use `buildUndefinedNode` in accessor templates

* Extract `isAccessor` variable
This commit is contained in:
Tim McClure
2019-09-06 12:08:10 -04:00
committed by Nicolò Ribaudo
parent da0af5fd99
commit 3e4889d649
35 changed files with 749 additions and 90 deletions

View File

@@ -1,6 +1,7 @@
class Cl {
constructor() {
Object.defineProperty(this, _privateFieldValue, {
get: void 0,
set: _set_privateFieldValue
});
Object.defineProperty(this, _privateField, {

View File

@@ -1,7 +1,8 @@
class Cl {
constructor() {
Object.defineProperty(this, _privateFieldValue, {
get: _get_privateFieldValue
get: _get_privateFieldValue,
set: void 0
});
Object.defineProperty(this, _privateField, {
writable: true,

View File

@@ -1,6 +1,7 @@
class Cl {
constructor() {
_privateFieldValue.set(this, {
get: void 0,
set: _set_privateFieldValue
});

View File

@@ -1,7 +1,8 @@
class Cl {
constructor() {
_privateFieldValue.set(this, {
get: _get_privateFieldValue
get: _get_privateFieldValue,
set: void 0
});
_privateField.set(this, {

View File

@@ -20,6 +20,10 @@ var _getA = babelHelpers.classPrivateFieldLooseKey("getA");
var _getB = babelHelpers.classPrivateFieldLooseKey("getB");
var _getB2 = function _getB2() {
return this.b;
};
var _getA2 = function _getA2() {
return A.a;
};
@@ -27,11 +31,6 @@ var _getA2 = function _getA2() {
Object.defineProperty(B, _getA, {
value: _getA2
});
var _getB2 = function _getB2() {
return this.b;
};
Object.defineProperty(B, _getB, {
value: _getB2
});

View File

@@ -16,12 +16,12 @@ class B extends A {
}
var _getA = function _getA() {
return babelHelpers.get(babelHelpers.getPrototypeOf(B), "a", this);
};
var _getB = function _getB() {
return this.b;
};
var _getA = function _getA() {
return babelHelpers.get(babelHelpers.getPrototypeOf(B), "a", this);
};
var [getA, getB] = B.extract();

View File

@@ -0,0 +1,23 @@
class Cl {
static #PRIVATE_STATIC_FIELD = "top secret string";
static get #privateStaticFieldValue() {
return Cl.#PRIVATE_STATIC_FIELD;
}
static set #privateStaticFieldValue(newValue) {
Cl.#PRIVATE_STATIC_FIELD = `Updated: ${newValue}`;
}
static getValue() {
return Cl.#privateStaticFieldValue;
}
static setValue() {
Cl.#privateStaticFieldValue = "dank";
}
}
expect(Cl.getValue()).toEqual("top secret string");
Cl.setValue();
expect(Cl.getValue()).toEqual("Updated: dank");

View File

@@ -0,0 +1,19 @@
class Cl {
static #PRIVATE_STATIC_FIELD = "top secret string";
static get #privateStaticFieldValue() {
return Cl.#PRIVATE_STATIC_FIELD;
}
static set #privateStaticFieldValue(newValue) {
Cl.#PRIVATE_STATIC_FIELD = `Updated: ${newValue}`;
}
static getValue() {
return Cl.#privateStaticFieldValue;
}
static setValue() {
Cl.#privateStaticFieldValue = "dank";
}
}

View File

@@ -0,0 +1,31 @@
class Cl {
static getValue() {
return babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticFieldValue)[_privateStaticFieldValue];
}
static setValue() {
babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticFieldValue)[_privateStaticFieldValue] = "dank";
}
}
var _PRIVATE_STATIC_FIELD = babelHelpers.classPrivateFieldLooseKey("PRIVATE_STATIC_FIELD");
var _privateStaticFieldValue = babelHelpers.classPrivateFieldLooseKey("privateStaticFieldValue");
var _set_privateStaticFieldValue = function (newValue) {
babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD] = `Updated: ${newValue}`;
};
var _get_privateStaticFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD];
};
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: "top secret string"
});
Object.defineProperty(Cl, _privateStaticFieldValue, {
get: _get_privateStaticFieldValue,
set: _set_privateStaticFieldValue
});

View File

@@ -0,0 +1,13 @@
class Cl {
static #PRIVATE_STATIC_FIELD = 0;
static set #privateStaticFieldValue(newValue) {
Cl.#PRIVATE_STATIC_FIELD = newValue;
}
static getPrivateStaticFieldValue() {
return Cl.#privateStaticFieldValue;
}
}
expect(Cl.getPrivateStaticFieldValue()).toBeUndefined();

View File

@@ -0,0 +1,11 @@
class Cl {
static #PRIVATE_STATIC_FIELD = 0;
static set #privateStaticFieldValue(newValue) {
Cl.#PRIVATE_STATIC_FIELD = newValue;
}
static getPrivateStaticFieldValue() {
return Cl.#privateStaticFieldValue;
}
}

View File

@@ -0,0 +1,23 @@
class Cl {
static getPrivateStaticFieldValue() {
return babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticFieldValue)[_privateStaticFieldValue];
}
}
var _PRIVATE_STATIC_FIELD = babelHelpers.classPrivateFieldLooseKey("PRIVATE_STATIC_FIELD");
var _privateStaticFieldValue = babelHelpers.classPrivateFieldLooseKey("privateStaticFieldValue");
var _set_privateStaticFieldValue = function (newValue) {
babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD] = newValue;
};
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: 0
});
Object.defineProperty(Cl, _privateStaticFieldValue, {
get: void 0,
set: _set_privateStaticFieldValue
});

View File

@@ -0,0 +1,14 @@
{
"plugins": [
[
"external-helpers",
{
"helperVersion": "7.1000.0"
}
],
["proposal-private-methods", { "loose": true }],
["proposal-class-properties", { "loose": true }],
"transform-block-scoping",
"syntax-class-properties"
]
}

View File

@@ -0,0 +1,13 @@
class Cl {
static #PRIVATE_STATIC_FIELD = 0;
static get #privateStaticFieldValue() {
return Cl.#PRIVATE_STATIC_FIELD;
}
static setPrivateStaticFieldValue() {
Cl.#privateStaticFieldValue = 1;
}
}
expect(() => Cl.setPrivateStaticFieldValue()).toThrow(TypeError);

View File

@@ -0,0 +1,11 @@
class Cl {
static #PRIVATE_STATIC_FIELD = 0;
static get #privateStaticFieldValue() {
return Cl.#PRIVATE_STATIC_FIELD;
}
static setPrivateStaticFieldValue() {
Cl.#privateStaticFieldValue = 1;
}
}

View File

@@ -0,0 +1,23 @@
class Cl {
static setPrivateStaticFieldValue() {
babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticFieldValue)[_privateStaticFieldValue] = 1;
}
}
var _PRIVATE_STATIC_FIELD = babelHelpers.classPrivateFieldLooseKey("PRIVATE_STATIC_FIELD");
var _privateStaticFieldValue = babelHelpers.classPrivateFieldLooseKey("privateStaticFieldValue");
var _get_privateStaticFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD];
};
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: 0
});
Object.defineProperty(Cl, _privateStaticFieldValue, {
get: _get_privateStaticFieldValue,
set: void 0
});

View File

@@ -0,0 +1,46 @@
class Cl {
static #privateField = "top secret string";
static publicField = "not secret string";
static get #privateFieldValue() {
return Cl.#privateField;
}
static set #privateFieldValue(newValue) {
Cl.#privateField = newValue;
}
static publicGetPrivateField() {
return Cl.#privateFieldValue;
}
static publicSetPrivateField(newValue) {
Cl.#privateFieldValue = newValue;
}
static get publicFieldValue() {
return Cl.publicField;
}
static set publicFieldValue(newValue) {
Cl.publicField = newValue;
}
static testUpdates() {
Cl.#privateField = 0;
Cl.publicField = 0;
Cl.#privateFieldValue = Cl.#privateFieldValue++;
Cl.publicFieldValue = Cl.publicFieldValue++;
expect(Cl.#privateField).toEqual(Cl.publicField);
++Cl.#privateFieldValue;
++Cl.publicFieldValue;
expect(Cl.#privateField).toEqual(Cl.publicField);
Cl.#privateFieldValue += 1;
Cl.publicFieldValue += 1;
expect(Cl.#privateField).toEqual(Cl.publicField);
}
}
Cl.testUpdates();

View File

@@ -0,0 +1,44 @@
class Cl {
static #privateField = "top secret string";
static publicField = "not secret string";
static get #privateFieldValue() {
return Cl.#privateField;
}
static set #privateFieldValue(newValue) {
Cl.#privateField = newValue;
}
static publicGetPrivateField() {
return Cl.#privateFieldValue;
}
static publicSetPrivateField(newValue) {
Cl.#privateFieldValue = newValue;
}
static get publicFieldValue() {
return Cl.publicField;
}
static set publicFieldValue(newValue) {
Cl.publicField = newValue;
}
static testUpdates() {
Cl.#privateField = 0;
Cl.publicField = 0;
Cl.#privateFieldValue = Cl.#privateFieldValue++;
Cl.publicFieldValue = Cl.publicFieldValue++;
++Cl.#privateFieldValue;
++Cl.publicFieldValue;
Cl.#privateFieldValue += 1;
Cl.publicFieldValue += 1;
Cl.#privateFieldValue = -(Cl.#privateFieldValue ** Cl.#privateFieldValue);
Cl.publicFieldValue = -(Cl.publicFieldValue ** Cl.publicFieldValue);
}
}

View File

@@ -0,0 +1,53 @@
class Cl {
static publicGetPrivateField() {
return babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue];
}
static publicSetPrivateField(newValue) {
babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] = newValue;
}
static get publicFieldValue() {
return Cl.publicField;
}
static set publicFieldValue(newValue) {
Cl.publicField = newValue;
}
static testUpdates() {
babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField] = 0;
Cl.publicField = 0;
babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] = babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue]++;
Cl.publicFieldValue = Cl.publicFieldValue++;
++babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue];
++Cl.publicFieldValue;
babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] += 1;
Cl.publicFieldValue += 1;
babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] = -(babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] ** babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue]);
Cl.publicFieldValue = -(Cl.publicFieldValue ** Cl.publicFieldValue);
}
}
var _privateField = babelHelpers.classPrivateFieldLooseKey("privateField");
var _privateFieldValue = babelHelpers.classPrivateFieldLooseKey("privateFieldValue");
var _set_privateFieldValue = function (newValue) {
babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField] = newValue;
};
var _get_privateFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField];
};
Object.defineProperty(Cl, _privateField, {
writable: true,
value: "top secret string"
});
Cl.publicField = "not secret string";
Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue,
set: _set_privateFieldValue
});

View File

@@ -0,0 +1,23 @@
class Cl {
static #PRIVATE_STATIC_FIELD = "top secret string";
static get #privateStaticFieldValue() {
return Cl.#PRIVATE_STATIC_FIELD;
}
static set #privateStaticFieldValue(newValue) {
Cl.#PRIVATE_STATIC_FIELD = `Updated: ${newValue}`;
}
static getValue() {
return Cl.#privateStaticFieldValue;
}
static setValue() {
Cl.#privateStaticFieldValue = "dank";
}
}
expect(Cl.getValue()).toEqual("top secret string");
Cl.setValue();
expect(Cl.getValue()).toEqual("Updated: dank");

View File

@@ -0,0 +1,19 @@
class Cl {
static #PRIVATE_STATIC_FIELD = "top secret string";
static get #privateStaticFieldValue() {
return Cl.#PRIVATE_STATIC_FIELD;
}
static set #privateStaticFieldValue(newValue) {
Cl.#PRIVATE_STATIC_FIELD = `Updated: ${newValue}`;
}
static getValue() {
return Cl.#privateStaticFieldValue;
}
static setValue() {
Cl.#privateStaticFieldValue = "dank";
}
}

View File

@@ -0,0 +1,27 @@
class Cl {
static getValue() {
return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateStaticFieldValue);
}
static setValue() {
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateStaticFieldValue, "dank");
}
}
var _set_privateStaticFieldValue = function (newValue) {
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _PRIVATE_STATIC_FIELD, `Updated: ${newValue}`);
};
var _get_privateStaticFieldValue = function () {
return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _PRIVATE_STATIC_FIELD);
};
var _PRIVATE_STATIC_FIELD = {
writable: true,
value: "top secret string"
};
var _privateStaticFieldValue = {
get: _get_privateStaticFieldValue,
set: _set_privateStaticFieldValue
};

View File

@@ -0,0 +1,13 @@
class Cl {
static #PRIVATE_STATIC_FIELD = 0;
static set #privateStaticFieldValue(newValue) {
Cl.#PRIVATE_STATIC_FIELD = newValue;
}
static getPrivateStaticFieldValue() {
return Cl.#privateStaticFieldValue;
}
}
expect(Cl.getPrivateStaticFieldValue()).toBeUndefined();

View File

@@ -0,0 +1,11 @@
class Cl {
static #PRIVATE_STATIC_FIELD = 0;
static set #privateStaticFieldValue(newValue) {
Cl.#PRIVATE_STATIC_FIELD = newValue;
}
static getPrivateStaticFieldValue() {
return Cl.#privateStaticFieldValue;
}
}

View File

@@ -0,0 +1,19 @@
class Cl {
static getPrivateStaticFieldValue() {
return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateStaticFieldValue);
}
}
var _set_privateStaticFieldValue = function (newValue) {
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _PRIVATE_STATIC_FIELD, newValue);
};
var _PRIVATE_STATIC_FIELD = {
writable: true,
value: 0
};
var _privateStaticFieldValue = {
get: void 0,
set: _set_privateStaticFieldValue
};

View File

@@ -0,0 +1,14 @@
{
"plugins": [
[
"external-helpers",
{
"helperVersion": "7.1000.0"
}
],
"proposal-private-methods",
"proposal-class-properties",
"transform-block-scoping",
"syntax-class-properties"
]
}

View File

@@ -0,0 +1,13 @@
class Cl {
static #PRIVATE_STATIC_FIELD = 0;
static get #privateStaticFieldValue() {
return Cl.#PRIVATE_STATIC_FIELD;
}
static setPrivateStaticFieldValue() {
Cl.#privateStaticFieldValue = 1;
}
}
expect(() => Cl.setPrivateStaticFieldValue()).toThrow(TypeError);

View File

@@ -0,0 +1,11 @@
class Cl {
static #PRIVATE_STATIC_FIELD = 0;
static get #privateStaticFieldValue() {
return Cl.#PRIVATE_STATIC_FIELD;
}
static setPrivateStaticFieldValue() {
Cl.#privateStaticFieldValue = 1;
}
}

View File

@@ -0,0 +1,19 @@
class Cl {
static setPrivateStaticFieldValue() {
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateStaticFieldValue, 1);
}
}
var _get_privateStaticFieldValue = function () {
return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _PRIVATE_STATIC_FIELD);
};
var _PRIVATE_STATIC_FIELD = {
writable: true,
value: 0
};
var _privateStaticFieldValue = {
get: _get_privateStaticFieldValue,
set: void 0
};

View File

@@ -0,0 +1,46 @@
class Cl {
static #privateField = "top secret string";
static publicField = "not secret string";
static get #privateFieldValue() {
return Cl.#privateField;
}
static set #privateFieldValue(newValue) {
Cl.#privateField = newValue;
}
static publicGetPrivateField() {
return Cl.#privateFieldValue;
}
static publicSetPrivateField(newValue) {
Cl.#privateFieldValue = newValue;
}
static get publicFieldValue() {
return Cl.publicField;
}
static set publicFieldValue(newValue) {
Cl.publicField = newValue;
}
static testUpdates() {
Cl.#privateField = 0;
Cl.publicField = 0;
Cl.#privateFieldValue = Cl.#privateFieldValue++;
Cl.publicFieldValue = Cl.publicFieldValue++;
expect(Cl.#privateField).toEqual(Cl.publicField);
++Cl.#privateFieldValue;
++Cl.publicFieldValue;
expect(Cl.#privateField).toEqual(Cl.publicField);
Cl.#privateFieldValue += 1;
Cl.publicFieldValue += 1;
expect(Cl.#privateField).toEqual(Cl.publicField);
}
}
Cl.testUpdates();

View File

@@ -0,0 +1,44 @@
class Cl {
static #privateField = "top secret string";
static publicField = "not secret string";
static get #privateFieldValue() {
return Cl.#privateField;
}
static set #privateFieldValue(newValue) {
Cl.#privateField = newValue;
}
static publicGetPrivateField() {
return Cl.#privateFieldValue;
}
static publicSetPrivateField(newValue) {
Cl.#privateFieldValue = newValue;
}
static get publicFieldValue() {
return Cl.publicField;
}
static set publicFieldValue(newValue) {
Cl.publicField = newValue;
}
static testUpdates() {
Cl.#privateField = 0;
Cl.publicField = 0;
Cl.#privateFieldValue = Cl.#privateFieldValue++;
Cl.publicFieldValue = Cl.publicFieldValue++;
++Cl.#privateFieldValue;
++Cl.publicFieldValue;
Cl.#privateFieldValue += 1;
Cl.publicFieldValue += 1;
Cl.#privateFieldValue = -(Cl.#privateFieldValue ** Cl.#privateFieldValue);
Cl.publicFieldValue = -(Cl.publicFieldValue ** Cl.publicFieldValue);
}
}

View File

@@ -0,0 +1,51 @@
class Cl {
static publicGetPrivateField() {
return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateFieldValue);
}
static publicSetPrivateField(newValue) {
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateFieldValue, newValue);
}
static get publicFieldValue() {
return Cl.publicField;
}
static set publicFieldValue(newValue) {
Cl.publicField = newValue;
}
static testUpdates() {
var _Cl$privateFieldValue, _Cl$privateFieldValue2;
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateField, 0);
Cl.publicField = 0;
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateFieldValue, (babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateFieldValue, (_Cl$privateFieldValue2 = +babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateFieldValue)) + 1), _Cl$privateFieldValue2));
Cl.publicFieldValue = Cl.publicFieldValue++;
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateFieldValue, +babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateFieldValue) + 1);
++Cl.publicFieldValue;
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateFieldValue, babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateFieldValue) + 1);
Cl.publicFieldValue += 1;
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateFieldValue, -(babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateFieldValue) ** babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateFieldValue)));
Cl.publicFieldValue = -(Cl.publicFieldValue ** Cl.publicFieldValue);
}
}
var _set_privateFieldValue = function (newValue) {
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateField, newValue);
};
var _get_privateFieldValue = function () {
return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateField);
};
var _privateField = {
writable: true,
value: "top secret string"
};
babelHelpers.defineProperty(Cl, "publicField", "not secret string");
var _privateFieldValue = {
get: _get_privateFieldValue,
set: _set_privateFieldValue
};