From 4ce12f9f659bddc869800720b86c9c0d6e5e7dd6 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Thu, 20 May 2021 14:35:40 -0700 Subject: [PATCH] Move class name capture for private state until after declaration evaluates (#44186) --- src/compiler/transformers/classFields.ts | 9 ++++- ...ameComputedPropertyName4(target=es2015).js | 39 +++++++++++++++++++ ...ameComputedPropertyName4(target=esnext).js | 30 ++++++++++++++ .../privateNameComputedPropertyName4.ts | 16 ++++++++ 4 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/privateNameComputedPropertyName4(target=es2015).js create mode 100644 tests/baselines/reference/privateNameComputedPropertyName4(target=esnext).js create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName4.ts diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 407cff5d4bb5b..e820851dde949 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -658,13 +658,14 @@ namespace ts { } const staticProperties = getProperties(node, /*requireInitializer*/ false, /*isStatic*/ true); + let pendingPrivateStateAssignment: BinaryExpression | undefined; if (shouldTransformPrivateElements && some(node.members, m => hasStaticModifier(m) && !!m.name && isPrivateIdentifier(m.name))) { const temp = factory.createTempVariable(hoistVariableDeclaration, /* reservedInNestedScopes */ true); getPrivateIdentifierEnvironment().classConstructor = factory.cloneNode(temp); - getPendingExpressions().push(factory.createAssignment( + pendingPrivateStateAssignment = factory.createAssignment( temp, factory.getInternalName(node) - )); + ); } const extendsClauseElement = getEffectiveBaseTypeNode(node); @@ -682,6 +683,10 @@ namespace ts { ) ]; + if (pendingPrivateStateAssignment) { + getPendingExpressions().unshift(pendingPrivateStateAssignment); + } + // Write any pending expressions from elided or moved computed property names if (some(pendingExpressions)) { statements.push(factory.createExpressionStatement(factory.inlineExpressions(pendingExpressions))); diff --git a/tests/baselines/reference/privateNameComputedPropertyName4(target=es2015).js b/tests/baselines/reference/privateNameComputedPropertyName4(target=es2015).js new file mode 100644 index 0000000000000..235d3b93987e2 --- /dev/null +++ b/tests/baselines/reference/privateNameComputedPropertyName4(target=es2015).js @@ -0,0 +1,39 @@ +//// [privateNameComputedPropertyName4.ts] +// https://github.com/microsoft/TypeScript/issues/44113 +class C1 { + static #qux = 42; + ["bar"] () {} +} +class C2 { + static #qux = 42; + static ["bar"] () {} +} +class C3 { + static #qux = 42; + static ["bar"] = "test"; +} + + +//// [privateNameComputedPropertyName4.js] +var _a, _C1_qux, _b, _C2_qux, _c, _C3_qux; +// https://github.com/microsoft/TypeScript/issues/44113 +class C1 { + ["bar"]() { } +} +_a = C1; +_C1_qux = { value: 42 }; +class C2 { + static ["bar"]() { } +} +_b = C2; +_C2_qux = { value: 42 }; +class C3 { +} +_c = C3; +_C3_qux = { value: 42 }; +Object.defineProperty(C3, "bar", { + enumerable: true, + configurable: true, + writable: true, + value: "test" +}); diff --git a/tests/baselines/reference/privateNameComputedPropertyName4(target=esnext).js b/tests/baselines/reference/privateNameComputedPropertyName4(target=esnext).js new file mode 100644 index 0000000000000..26190d3042c21 --- /dev/null +++ b/tests/baselines/reference/privateNameComputedPropertyName4(target=esnext).js @@ -0,0 +1,30 @@ +//// [privateNameComputedPropertyName4.ts] +// https://github.com/microsoft/TypeScript/issues/44113 +class C1 { + static #qux = 42; + ["bar"] () {} +} +class C2 { + static #qux = 42; + static ["bar"] () {} +} +class C3 { + static #qux = 42; + static ["bar"] = "test"; +} + + +//// [privateNameComputedPropertyName4.js] +// https://github.com/microsoft/TypeScript/issues/44113 +class C1 { + static #qux = 42; + ["bar"]() { } +} +class C2 { + static #qux = 42; + static ["bar"]() { } +} +class C3 { + static #qux = 42; + static ["bar"] = "test"; +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName4.ts b/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName4.ts new file mode 100644 index 0000000000000..e20efa4646f8f --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName4.ts @@ -0,0 +1,16 @@ +// @target: esnext, es2015 +// @useDefineForClassFields: true +// @noTypesAndSymbols: true +// https://github.com/microsoft/TypeScript/issues/44113 +class C1 { + static #qux = 42; + ["bar"] () {} +} +class C2 { + static #qux = 42; + static ["bar"] () {} +} +class C3 { + static #qux = 42; + static ["bar"] = "test"; +}