Skip to content

Commit ec47d33

Browse files
authored
Make computed property names always checked, regardless of parent grammar errors (#64674)
1 parent a501b11 commit ec47d33

56 files changed

Lines changed: 873 additions & 11 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎tsc/internal/checker/checker.go‎

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5234,6 +5234,9 @@ func (c *Checker) checkEnumMember(node *ast.Node) {
52345234
if ast.IsPrivateIdentifier(node.Name()) {
52355235
c.error(node, diagnostics.An_enum_member_cannot_be_named_with_a_private_identifier)
52365236
}
5237+
if ast.IsComputedPropertyName(node.Name()) {
5238+
c.checkExpression(node.Name().Expression())
5239+
}
52375240
if node.Initializer() != nil {
52385241
c.checkExpression(node.Initializer())
52395242
}
@@ -28792,13 +28795,7 @@ func (c *Checker) markLinkedReferences(location *ast.Node, hint ReferenceHint, p
2879228795
return
2879328796
}
2879428797
}
28795-
// Computed property names on enum members are a grammar error and are never checked
28796-
// (checkEnumMember only checks the member initializer, not the name), so resolving
28797-
// identifiers in them here would report a spurious "Cannot find name" diagnostic.
2879828798
if computedName != nil {
28799-
if ast.IsEnumMember(computedName.Parent) {
28800-
return
28801-
}
2880228799
if isInvalidComputedPropertyName(computedName) {
2880328800
return
2880428801
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
deprecatedReferenceInEnumComputedNameNoFlake.ts(5,5): error TS1164: Computed property names are not allowed in enums.
2+
deprecatedReferenceInEnumComputedNameNoFlake.ts(5,6): suggestion TS6385: 'oldValue' is deprecated.
3+
4+
5+
==== deprecatedReferenceInEnumComputedNameNoFlake.ts (2 errors) ====
6+
// TS6385: 'oldValue' is deprecated.
7+
/** @deprecated */
8+
declare const oldValue: { value: number };
9+
export enum Values {
10+
[oldValue.value] = 1,
11+
~~~~~~~~~~~~~~~~
12+
!!! error TS1164: Computed property names are not allowed in enums.
13+
~~~~~~~~
14+
!!! suggestion TS6385: 'oldValue' is deprecated.
15+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//// [tests/cases/compiler/deprecatedReferenceInEnumComputedNameNoFlake.ts] ////
2+
3+
//// [deprecatedReferenceInEnumComputedNameNoFlake.ts]
4+
// TS6385: 'oldValue' is deprecated.
5+
/** @deprecated */
6+
declare const oldValue: { value: number };
7+
export enum Values {
8+
[oldValue.value] = 1,
9+
}
10+
11+
//// [deprecatedReferenceInEnumComputedNameNoFlake.js]
12+
export var Values;
13+
(function (Values) {
14+
Values[Values[oldValue.value] = 1] = oldValue.value;
15+
})(Values || (Values = {}));
16+
17+
18+
//// [deprecatedReferenceInEnumComputedNameNoFlake.d.ts]
19+
export declare enum Values {
20+
[oldValue.value] = 1
21+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//// [tests/cases/compiler/deprecatedReferenceInEnumComputedNameNoFlake.ts] ////
2+
3+
=== deprecatedReferenceInEnumComputedNameNoFlake.ts ===
4+
// TS6385: 'oldValue' is deprecated.
5+
/** @deprecated */
6+
declare const oldValue: { value: number };
7+
>oldValue : Symbol(oldValue, Decl(deprecatedReferenceInEnumComputedNameNoFlake.ts, 2, 13))
8+
>value : Symbol(value, Decl(deprecatedReferenceInEnumComputedNameNoFlake.ts, 2, 25))
9+
10+
export enum Values {
11+
>Values : Symbol(Values, Decl(deprecatedReferenceInEnumComputedNameNoFlake.ts, 2, 42))
12+
13+
[oldValue.value] = 1,
14+
>[oldValue.value] : Symbol(Values[oldValue.value], Decl(deprecatedReferenceInEnumComputedNameNoFlake.ts, 3, 20))
15+
>oldValue.value : Symbol(value, Decl(deprecatedReferenceInEnumComputedNameNoFlake.ts, 2, 25))
16+
>oldValue : Symbol(oldValue, Decl(deprecatedReferenceInEnumComputedNameNoFlake.ts, 2, 13))
17+
>value : Symbol(value, Decl(deprecatedReferenceInEnumComputedNameNoFlake.ts, 2, 25))
18+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//// [tests/cases/compiler/deprecatedReferenceInEnumComputedNameNoFlake.ts] ////
2+
3+
=== deprecatedReferenceInEnumComputedNameNoFlake.ts ===
4+
// TS6385: 'oldValue' is deprecated.
5+
/** @deprecated */
6+
declare const oldValue: { value: number };
7+
>oldValue : { value: number; }
8+
>value : number
9+
10+
export enum Values {
11+
>Values : Values
12+
13+
[oldValue.value] = 1,
14+
>[oldValue.value] : Values
15+
>oldValue.value : number
16+
>oldValue : { value: number; }
17+
>value : number
18+
>1 : 1
19+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
main.ts(4,5): error TS1164: Computed property names are not allowed in enums.
2+
3+
4+
==== key.ts (0 errors) ====
5+
export const key = "member";
6+
7+
==== main.ts (1 errors) ====
8+
import { key } from "./key";
9+
10+
export enum Example {
11+
[key] = 0,
12+
~~~~~
13+
!!! error TS1164: Computed property names are not allowed in enums.
14+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//// [tests/cases/compiler/importedValueInEnumComputedNameNoFlake.ts] ////
2+
3+
//// [key.ts]
4+
export const key = "member";
5+
6+
//// [main.ts]
7+
import { key } from "./key";
8+
9+
export enum Example {
10+
[key] = 0,
11+
}
12+
13+
//// [key.js]
14+
export const key = "member";
15+
//// [main.js]
16+
import { key } from "./key";
17+
export var Example;
18+
(function (Example) {
19+
Example[Example[key] = 0] = key;
20+
})(Example || (Example = {}));
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//// [tests/cases/compiler/importedValueInEnumComputedNameNoFlake.ts] ////
2+
3+
=== key.ts ===
4+
export const key = "member";
5+
>key : Symbol(key, Decl(key.ts, 0, 12))
6+
7+
=== main.ts ===
8+
import { key } from "./key";
9+
>key : Symbol(key, Decl(main.ts, 0, 8))
10+
11+
export enum Example {
12+
>Example : Symbol(Example, Decl(main.ts, 0, 28))
13+
14+
[key] = 0,
15+
>[key] : Symbol(Example[key], Decl(main.ts, 2, 21))
16+
>key : Symbol(key, Decl(main.ts, 0, 8))
17+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//// [tests/cases/compiler/importedValueInEnumComputedNameNoFlake.ts] ////
2+
3+
=== key.ts ===
4+
export const key = "member";
5+
>key : "member"
6+
>"member" : "member"
7+
8+
=== main.ts ===
9+
import { key } from "./key";
10+
>key : "member"
11+
12+
export enum Example {
13+
>Example : Example
14+
15+
[key] = 0,
16+
>[key] : Example
17+
>key : "member"
18+
>0 : 0
19+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
incompatibleAssignmentInEnumComputedNameNoFlake.ts(4,5): error TS1164: Computed property names are not allowed in enums.
2+
incompatibleAssignmentInEnumComputedNameNoFlake.ts(5,23): error TS2322: Type 'string' is not assignable to type 'number'.
3+
4+
5+
==== incompatibleAssignmentInEnumComputedNameNoFlake.ts (2 errors) ====
6+
// TS2322: Type 'string' is not assignable to type 'number'.
7+
let target: number;
8+
enum E {
9+
[(() => {
10+
~~~~~~~~~
11+
const text = (target = "value");
12+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13+
~~~~~~
14+
!!! error TS2322: Type 'string' is not assignable to type 'number'.
15+
return text.length;
16+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
17+
})()]
18+
~~~~~~~~~
19+
!!! error TS1164: Computed property names are not allowed in enums.
20+
}

0 commit comments

Comments
 (0)