Ensure static private method init run before static property (#12918)

This commit is contained in:
Huáng Jùnliàng 2021-03-03 18:02:23 -05:00 committed by GitHub
parent bdb207cb75
commit ac758f7d70
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 163 additions and 143 deletions

View File

@ -806,7 +806,7 @@ export function buildFieldsInitNodes(
break;
case isStatic && isPrivate && isMethod && !privateFieldsAsProperties:
needsClassRef = true;
staticNodes.push(
staticNodes.unshift(
buildPrivateStaticFieldInitSpec(prop, privateNamesMap),
);
staticNodes.unshift(
@ -819,7 +819,7 @@ export function buildFieldsInitNodes(
break;
case isStatic && isPrivate && isMethod && privateFieldsAsProperties:
needsClassRef = true;
staticNodes.push(
staticNodes.unshift(
buildPrivateStaticMethodInitLoose(
t.cloneNode(ref),
prop,

View File

@ -24,6 +24,10 @@ var _getB2 = function _getB2() {
return this.b;
};
Object.defineProperty(B, _getB, {
value: _getB2
});
var _getA2 = function _getA2() {
return A.a;
};
@ -31,7 +35,4 @@ var _getA2 = function _getA2() {
Object.defineProperty(B, _getA, {
value: _getA2
});
Object.defineProperty(B, _getB, {
value: _getB2
});
var [getA, getB] = B.extract();

View File

@ -24,6 +24,10 @@ var _getB2 = function _getB2() {
return this.b;
};
Object.defineProperty(B, _getB, {
value: _getB2
});
var _getA2 = function _getA2() {
return babelHelpers.get(babelHelpers.getPrototypeOf(B), "a", this);
};
@ -31,7 +35,4 @@ var _getA2 = function _getA2() {
Object.defineProperty(B, _getA, {
value: _getA2
});
Object.defineProperty(B, _getB, {
value: _getB2
});
const [getA, getB] = B.extract();

View File

@ -1,29 +0,0 @@
expect(() => {
class C {
static #_ = new C;
static get #p() { return C };
constructor() {
C.#p;
}
}
}).toThrow(/attempted to use private field on non-instance/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
C.#p = 0;
}
}
}).toThrow(/attempted to use private field on non-instance/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
for (C.#p of [0]);
}
}
}).toThrow(/attempted to use private field on non-instance/);

View File

@ -0,0 +1,35 @@
expect((() => {
let r;
class C {
static #_ = new C;
static get #p() { return 0 };
constructor() {
r = C.#p;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
C.#p = 0;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
for (C.#p of [0]);
}
}
return r;
})()).toBe(0);

View File

@ -21,11 +21,11 @@ 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
});
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: "top secret string"
});

View File

@ -13,11 +13,11 @@ 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
});
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: 0
});

View File

@ -14,12 +14,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField];
};
Object.defineProperty(Cl, _privateField, {
writable: true,
value: 0
});
Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue,
set: void 0
});
Object.defineProperty(Cl, _privateField, {
writable: true,
value: 0
});
var cl = new Cl();

View File

@ -42,12 +42,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField];
};
Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue,
set: _set_privateFieldValue
});
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

@ -1,29 +0,0 @@
expect(() => {
class C {
static #_ = new C;
static get #p() { return C };
constructor() {
C.#p;
}
}
}).toThrow(/attempted to use private field on non-instance/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
C.#p = 0;
}
}
}).toThrow(/attempted to use private field on non-instance/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
for (C.#p of [0]);
}
}
}).toThrow(/attempted to use private field on non-instance/);

View File

@ -0,0 +1,35 @@
expect((() => {
let r;
class C {
static #_ = new C;
static get #p() { return 0 };
constructor() {
r = C.#p;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
C.#p = 0;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
for (C.#p of [0]);
}
}
return r;
})()).toBe(0);

View File

@ -21,11 +21,11 @@ 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
});
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: "top secret string"
});

View File

@ -13,11 +13,11 @@ 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
});
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: 0
});

View File

@ -14,12 +14,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField];
};
Object.defineProperty(Cl, _privateField, {
writable: true,
value: 0
});
Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue,
set: void 0
});
Object.defineProperty(Cl, _privateField, {
writable: true,
value: 0
});
const cl = new Cl();

View File

@ -42,12 +42,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField];
};
Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue,
set: _set_privateFieldValue
});
Object.defineProperty(Cl, _privateField, {
writable: true,
value: "top secret string"
});
babelHelpers.defineProperty(Cl, "publicField", "not secret string");
Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue,
set: _set_privateFieldValue
});

View File

@ -1,29 +0,0 @@
expect(() => {
class C {
static #_ = new C;
static get #p() { return C };
constructor() {
C.#p;
}
}
}).toThrow(/attempted to get private static field before its declaration/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
C.#p = 0;
}
}
}).toThrow(/attempted to set private static field before its declaration/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
for (C.#p of [0]);
}
}
}).toThrow(/attempted to set private static field before its declaration/);

View File

@ -0,0 +1,35 @@
expect((() => {
let r;
class C {
static #_ = new C;
static get #p() { return 0 };
constructor() {
r = C.#p;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
C.#p = 0;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
for (C.#p of [0]);
}
}
return r;
})()).toBe(0);

View File

@ -17,11 +17,11 @@ 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
};
var _PRIVATE_STATIC_FIELD = {
writable: true,
value: "top secret string"
};

View File

@ -9,11 +9,11 @@ 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
};
var _PRIVATE_STATIC_FIELD = {
writable: true,
value: 0
};

View File

@ -10,12 +10,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classStaticPrivateFieldSpecGet(this, Cl, _privateField);
};
var _privateField = {
writable: true,
value: 0
};
var _privateFieldValue = {
get: _get_privateFieldValue,
set: void 0
};
var _privateField = {
writable: true,
value: 0
};
var cl = new Cl();

View File

@ -40,12 +40,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateField);
};
var _privateFieldValue = {
get: _get_privateFieldValue,
set: _set_privateFieldValue
};
var _privateField = {
writable: true,
value: "top secret string"
};
babelHelpers.defineProperty(Cl, "publicField", "not secret string");
var _privateFieldValue = {
get: _get_privateFieldValue,
set: _set_privateFieldValue
};