Skip to content

Commit b5f37ca

Browse files
committed
Error on override used on dynamically named class members
1 parent b263cc4 commit b5f37ca

File tree

29 files changed

+1358
-0
lines changed

29 files changed

+1358
-0
lines changed

src/compiler/checker.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46765,6 +46765,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4676546765
): MemberOverrideStatus {
4676646766
const isJs = isInJSFile(node);
4676746767
const nodeInAmbientContext = !!(node.flags & NodeFlags.Ambient);
46768+
if (memberHasOverrideModifier && member?.valueDeclaration && isClassElement(member.valueDeclaration) && member.valueDeclaration.name && isNonBindableDynamicName(member.valueDeclaration.name)) {
46769+
error(
46770+
errorNode,
46771+
isJs ?
46772+
Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_name_is_dynamic :
46773+
Diagnostics.This_member_cannot_have_an_override_modifier_because_its_name_is_dynamic,
46774+
)
46775+
return MemberOverrideStatus.HasInvalidOverride;
46776+
}
4676846777
if (baseWithThis && (memberHasOverrideModifier || compilerOptions.noImplicitOverride)) {
4676946778
const thisType = memberIsStatic ? staticType : typeWithThis;
4677046779
const baseType = memberIsStatic ? baseStaticType : baseWithThis;

src/compiler/diagnosticMessages.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4417,6 +4417,14 @@
44174417
"category": "Error",
44184418
"code": 4126
44194419
},
4420+
"This member cannot have an 'override' modifier because its name is dynamic.": {
4421+
"category": "Error",
4422+
"code": 4127
4423+
},
4424+
"This member cannot have a JSDoc comment with an '@override' tag because its name is dynamic.": {
4425+
"category": "Error",
4426+
"code": 4128
4427+
},
44204428

44214429
"The current host does not support the '{0}' option.": {
44224430
"category": "Error",
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
overrideDynamicName1.ts(8,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
2+
overrideDynamicName1.ts(22,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
3+
4+
5+
==== overrideDynamicName1.ts (2 errors) ====
6+
let prop = "foo"
7+
8+
class Base1 {
9+
[prop]() {}
10+
}
11+
12+
class Derived1 extends Base1 {
13+
override [prop]() {}
14+
~~~~~~
15+
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
16+
}
17+
18+
class Base2 {
19+
[prop]() {}
20+
}
21+
22+
class Derived2 extends Base2 {
23+
[prop]() {}
24+
}
25+
26+
class Base3 {}
27+
28+
class Derived3 extends Base3 {
29+
override [prop]() {}
30+
~~~~~~
31+
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
32+
}
33+
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
2+
3+
//// [overrideDynamicName1.ts]
4+
let prop = "foo"
5+
6+
class Base1 {
7+
[prop]() {}
8+
}
9+
10+
class Derived1 extends Base1 {
11+
override [prop]() {}
12+
}
13+
14+
class Base2 {
15+
[prop]() {}
16+
}
17+
18+
class Derived2 extends Base2 {
19+
[prop]() {}
20+
}
21+
22+
class Base3 {}
23+
24+
class Derived3 extends Base3 {
25+
override [prop]() {}
26+
}
27+
28+
29+
30+
31+
//// [overrideDynamicName1.d.ts]
32+
declare let prop: string;
33+
declare class Base1 {
34+
[x: string]: () => void;
35+
}
36+
declare class Derived1 extends Base1 {
37+
[x: string]: () => void;
38+
}
39+
declare class Base2 {
40+
[x: string]: () => void;
41+
}
42+
declare class Derived2 extends Base2 {
43+
[x: string]: () => void;
44+
}
45+
declare class Base3 {
46+
}
47+
declare class Derived3 extends Base3 {
48+
[x: string]: () => void;
49+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
2+
3+
=== overrideDynamicName1.ts ===
4+
let prop = "foo"
5+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
6+
7+
class Base1 {
8+
>Base1 : Symbol(Base1, Decl(overrideDynamicName1.ts, 0, 16))
9+
10+
[prop]() {}
11+
>[prop] : Symbol(Base1[prop], Decl(overrideDynamicName1.ts, 2, 13))
12+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
13+
}
14+
15+
class Derived1 extends Base1 {
16+
>Derived1 : Symbol(Derived1, Decl(overrideDynamicName1.ts, 4, 1))
17+
>Base1 : Symbol(Base1, Decl(overrideDynamicName1.ts, 0, 16))
18+
19+
override [prop]() {}
20+
>[prop] : Symbol(Derived1[prop], Decl(overrideDynamicName1.ts, 6, 30))
21+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
22+
}
23+
24+
class Base2 {
25+
>Base2 : Symbol(Base2, Decl(overrideDynamicName1.ts, 8, 1))
26+
27+
[prop]() {}
28+
>[prop] : Symbol(Base2[prop], Decl(overrideDynamicName1.ts, 10, 13))
29+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
30+
}
31+
32+
class Derived2 extends Base2 {
33+
>Derived2 : Symbol(Derived2, Decl(overrideDynamicName1.ts, 12, 1))
34+
>Base2 : Symbol(Base2, Decl(overrideDynamicName1.ts, 8, 1))
35+
36+
[prop]() {}
37+
>[prop] : Symbol(Derived2[prop], Decl(overrideDynamicName1.ts, 14, 30))
38+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
39+
}
40+
41+
class Base3 {}
42+
>Base3 : Symbol(Base3, Decl(overrideDynamicName1.ts, 16, 1))
43+
44+
class Derived3 extends Base3 {
45+
>Derived3 : Symbol(Derived3, Decl(overrideDynamicName1.ts, 18, 14))
46+
>Base3 : Symbol(Base3, Decl(overrideDynamicName1.ts, 16, 1))
47+
48+
override [prop]() {}
49+
>[prop] : Symbol(Derived3[prop], Decl(overrideDynamicName1.ts, 20, 30))
50+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
51+
}
52+
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
2+
3+
=== overrideDynamicName1.ts ===
4+
let prop = "foo"
5+
>prop : string
6+
> : ^^^^^^
7+
>"foo" : "foo"
8+
> : ^^^^^
9+
10+
class Base1 {
11+
>Base1 : Base1
12+
> : ^^^^^
13+
14+
[prop]() {}
15+
>[prop] : () => void
16+
> : ^^^^^^^^^^
17+
>prop : string
18+
> : ^^^^^^
19+
}
20+
21+
class Derived1 extends Base1 {
22+
>Derived1 : Derived1
23+
> : ^^^^^^^^
24+
>Base1 : Base1
25+
> : ^^^^^
26+
27+
override [prop]() {}
28+
>[prop] : () => void
29+
> : ^^^^^^^^^^
30+
>prop : string
31+
> : ^^^^^^
32+
}
33+
34+
class Base2 {
35+
>Base2 : Base2
36+
> : ^^^^^
37+
38+
[prop]() {}
39+
>[prop] : () => void
40+
> : ^^^^^^^^^^
41+
>prop : string
42+
> : ^^^^^^
43+
}
44+
45+
class Derived2 extends Base2 {
46+
>Derived2 : Derived2
47+
> : ^^^^^^^^
48+
>Base2 : Base2
49+
> : ^^^^^
50+
51+
[prop]() {}
52+
>[prop] : () => void
53+
> : ^^^^^^^^^^
54+
>prop : string
55+
> : ^^^^^^
56+
}
57+
58+
class Base3 {}
59+
>Base3 : Base3
60+
> : ^^^^^
61+
62+
class Derived3 extends Base3 {
63+
>Derived3 : Derived3
64+
> : ^^^^^^^^
65+
>Base3 : Base3
66+
> : ^^^^^
67+
68+
override [prop]() {}
69+
>[prop] : () => void
70+
> : ^^^^^^^^^^
71+
>prop : string
72+
> : ^^^^^^
73+
}
74+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
overrideDynamicName1.ts(8,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
2+
overrideDynamicName1.ts(22,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
3+
4+
5+
==== overrideDynamicName1.ts (2 errors) ====
6+
let prop = "foo"
7+
8+
class Base1 {
9+
[prop]() {}
10+
}
11+
12+
class Derived1 extends Base1 {
13+
override [prop]() {}
14+
~~~~~~
15+
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
16+
}
17+
18+
class Base2 {
19+
[prop]() {}
20+
}
21+
22+
class Derived2 extends Base2 {
23+
[prop]() {}
24+
}
25+
26+
class Base3 {}
27+
28+
class Derived3 extends Base3 {
29+
override [prop]() {}
30+
~~~~~~
31+
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
32+
}
33+
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
2+
3+
//// [overrideDynamicName1.ts]
4+
let prop = "foo"
5+
6+
class Base1 {
7+
[prop]() {}
8+
}
9+
10+
class Derived1 extends Base1 {
11+
override [prop]() {}
12+
}
13+
14+
class Base2 {
15+
[prop]() {}
16+
}
17+
18+
class Derived2 extends Base2 {
19+
[prop]() {}
20+
}
21+
22+
class Base3 {}
23+
24+
class Derived3 extends Base3 {
25+
override [prop]() {}
26+
}
27+
28+
29+
30+
31+
//// [overrideDynamicName1.d.ts]
32+
declare let prop: string;
33+
declare class Base1 {
34+
[x: string]: () => void;
35+
}
36+
declare class Derived1 extends Base1 {
37+
[x: string]: () => void;
38+
}
39+
declare class Base2 {
40+
[x: string]: () => void;
41+
}
42+
declare class Derived2 extends Base2 {
43+
[x: string]: () => void;
44+
}
45+
declare class Base3 {
46+
}
47+
declare class Derived3 extends Base3 {
48+
[x: string]: () => void;
49+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
2+
3+
=== overrideDynamicName1.ts ===
4+
let prop = "foo"
5+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
6+
7+
class Base1 {
8+
>Base1 : Symbol(Base1, Decl(overrideDynamicName1.ts, 0, 16))
9+
10+
[prop]() {}
11+
>[prop] : Symbol(Base1[prop], Decl(overrideDynamicName1.ts, 2, 13))
12+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
13+
}
14+
15+
class Derived1 extends Base1 {
16+
>Derived1 : Symbol(Derived1, Decl(overrideDynamicName1.ts, 4, 1))
17+
>Base1 : Symbol(Base1, Decl(overrideDynamicName1.ts, 0, 16))
18+
19+
override [prop]() {}
20+
>[prop] : Symbol(Derived1[prop], Decl(overrideDynamicName1.ts, 6, 30))
21+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
22+
}
23+
24+
class Base2 {
25+
>Base2 : Symbol(Base2, Decl(overrideDynamicName1.ts, 8, 1))
26+
27+
[prop]() {}
28+
>[prop] : Symbol(Base2[prop], Decl(overrideDynamicName1.ts, 10, 13))
29+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
30+
}
31+
32+
class Derived2 extends Base2 {
33+
>Derived2 : Symbol(Derived2, Decl(overrideDynamicName1.ts, 12, 1))
34+
>Base2 : Symbol(Base2, Decl(overrideDynamicName1.ts, 8, 1))
35+
36+
[prop]() {}
37+
>[prop] : Symbol(Derived2[prop], Decl(overrideDynamicName1.ts, 14, 30))
38+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
39+
}
40+
41+
class Base3 {}
42+
>Base3 : Symbol(Base3, Decl(overrideDynamicName1.ts, 16, 1))
43+
44+
class Derived3 extends Base3 {
45+
>Derived3 : Symbol(Derived3, Decl(overrideDynamicName1.ts, 18, 14))
46+
>Base3 : Symbol(Base3, Decl(overrideDynamicName1.ts, 16, 1))
47+
48+
override [prop]() {}
49+
>[prop] : Symbol(Derived3[prop], Decl(overrideDynamicName1.ts, 20, 30))
50+
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
51+
}
52+

0 commit comments

Comments
 (0)