Skip to content

Commit 08ef62d

Browse files
committed
attempt to retire TS4112 and treat classes as extending Object
1 parent 26aea0d commit 08ef62d

11 files changed

+75
-59
lines changed

Diff for: src/compiler/checker.ts

+2-11
Original file line numberDiff line numberDiff line change
@@ -38431,7 +38431,7 @@ namespace ts {
3843138431
const nodeInAmbientContext = !!(node.flags & NodeFlags.Ambient);
3843238432
const baseTypeNode = getEffectiveBaseTypeNode(node);
3843338433
const baseTypes = baseTypeNode && getBaseTypes(type);
38434-
const baseWithThis = baseTypes?.length ? getTypeWithThisArgument(first(baseTypes), type.thisType) : undefined;
38434+
const baseWithThis = baseTypes?.length ? getTypeWithThisArgument(first(baseTypes), type.thisType) : globalObjectType;
3843538435
const baseStaticType = getBaseConstructorTypeOfClass(type);
3843638436

3843738437
for (const member of node.members) {
@@ -38453,7 +38453,7 @@ namespace ts {
3845338453
const hasOverride = hasOverrideModifier(member);
3845438454
const hasStatic = isStatic(member);
3845538455
const isJs = isInJSFile(member);
38456-
if (baseWithThis && (hasOverride || compilerOptions.noImplicitOverride)) {
38456+
if (hasOverride || compilerOptions.noImplicitOverride) {
3845738457
const declaredProp = member.name && getSymbolAtLocation(member.name) || getSymbolAtLocation(member);
3845838458
if (!declaredProp) {
3845938459
return;
@@ -38503,15 +38503,6 @@ namespace ts {
3850338503
}
3850438504
}
3850538505
}
38506-
else if (hasOverride) {
38507-
const className = typeToString(type);
38508-
error(
38509-
member,
38510-
isJs ?
38511-
Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class :
38512-
Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class,
38513-
className);
38514-
}
3851538506
}
3851638507
}
3851738508

Diff for: src/services/codefixes/fixOverrideModifier.ts

-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ namespace ts.codefix {
1414

1515
const errorCodes = [
1616
Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code,
17-
Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code,
1817
Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0.code,
1918
Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code,
2019
Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code
@@ -24,9 +23,6 @@ namespace ts.codefix {
2423
[Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code]: [
2524
Diagnostics.Add_override_modifier, fixAddOverrideId, Diagnostics.Add_all_missing_override_modifiers,
2625
],
27-
[Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code]: [
28-
Diagnostics.Remove_override_modifier, fixRemoveOverrideId, Diagnostics.Remove_all_unnecessary_override_modifiers
29-
],
3026
[Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code]: [
3127
Diagnostics.Add_override_modifier, fixAddOverrideId, Diagnostics.Add_all_missing_override_modifiers,
3228
],
@@ -78,7 +74,6 @@ namespace ts.codefix {
7874
case Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code:
7975
return doAddOverrideModifierChange(changeTracker, context.sourceFile, pos);
8076
case Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code:
81-
case Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code:
8277
return doRemoveOverrideModifierChange(changeTracker, context.sourceFile, pos);
8378
default:
8479
Debug.fail("Unexpected error code: " + errorCode);

Diff for: tests/baselines/reference/override1.errors.txt

+12-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
tests/cases/conformance/override/override1.ts(9,5): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'B'.
22
tests/cases/conformance/override/override1.ts(11,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'.
3-
tests/cases/conformance/override/override1.ts(15,14): error TS4112: This member cannot have an 'override' modifier because its containing class 'C' does not extend another class.
4-
tests/cases/conformance/override/override1.ts(22,9): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'B'.
5-
tests/cases/conformance/override/override1.ts(24,18): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'.
6-
tests/cases/conformance/override/override1.ts(33,5): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class '(Anonymous class)'.
7-
tests/cases/conformance/override/override1.ts(37,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class '(Anonymous class)'.
8-
tests/cases/conformance/override/override1.ts(42,18): error TS4112: This member cannot have an 'override' modifier because its containing class '(Anonymous class)' does not extend another class.
3+
tests/cases/conformance/override/override1.ts(17,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
4+
tests/cases/conformance/override/override1.ts(26,9): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'B'.
5+
tests/cases/conformance/override/override1.ts(28,18): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'.
6+
tests/cases/conformance/override/override1.ts(37,5): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class '(Anonymous class)'.
7+
tests/cases/conformance/override/override1.ts(41,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class '(Anonymous class)'.
8+
tests/cases/conformance/override/override1.ts(46,18): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
99

1010

1111
==== tests/cases/conformance/override/override1.ts (8 errors) ====
@@ -24,12 +24,16 @@ tests/cases/conformance/override/override1.ts(42,18): error TS4112: This member
2424
override bar(v: string) {}
2525
~~~
2626
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'.
27+
28+
override toString() { return ''; }
2729
}
2830

2931
class C {
3032
override foo(v: string) {}
3133
~~~
32-
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'C' does not extend another class.
34+
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
35+
36+
override toString() { return ''; }
3337
}
3438

3539
function f () {
@@ -66,6 +70,6 @@ tests/cases/conformance/override/override1.ts(42,18): error TS4112: This member
6670
return class {
6771
override foo () {}
6872
~~~
69-
!!! error TS4112: This member cannot have an 'override' modifier because its containing class '(Anonymous class)' does not extend another class.
73+
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
7074
}
7175
}

Diff for: tests/baselines/reference/override1.js

+8
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ class D extends B {
1010
fooo (v: string) {}
1111

1212
override bar(v: string) {}
13+
14+
override toString() { return ''; }
1315
}
1416

1517
class C {
1618
override foo(v: string) {}
19+
20+
override toString() { return ''; }
1721
}
1822

1923
function f () {
@@ -75,12 +79,14 @@ var D = /** @class */ (function (_super) {
7579
D.prototype.foo = function (v) { };
7680
D.prototype.fooo = function (v) { };
7781
D.prototype.bar = function (v) { };
82+
D.prototype.toString = function () { return ''; };
7883
return D;
7984
}(B));
8085
var C = /** @class */ (function () {
8186
function C() {
8287
}
8388
C.prototype.foo = function (v) { };
89+
C.prototype.toString = function () { return ''; };
8490
return C;
8591
}());
8692
function f() {
@@ -131,9 +137,11 @@ declare class D extends B {
131137
foo(v: string): void;
132138
fooo(v: string): void;
133139
bar(v: string): void;
140+
toString(): string;
134141
}
135142
declare class C {
136143
foo(v: string): void;
144+
toString(): string;
137145
}
138146
declare function f(): {
139147
new (): {

Diff for: tests/baselines/reference/override1.symbols

+25-19
Original file line numberDiff line numberDiff line change
@@ -26,64 +26,70 @@ class D extends B {
2626
override bar(v: string) {}
2727
>bar : Symbol(D.bar, Decl(override1.ts, 8, 23))
2828
>v : Symbol(v, Decl(override1.ts, 10, 17))
29+
30+
override toString() { return ''; }
31+
>toString : Symbol(D.toString, Decl(override1.ts, 10, 30))
2932
}
3033

3134
class C {
32-
>C : Symbol(C, Decl(override1.ts, 11, 1))
35+
>C : Symbol(C, Decl(override1.ts, 13, 1))
3336

3437
override foo(v: string) {}
35-
>foo : Symbol(C.foo, Decl(override1.ts, 13, 9))
36-
>v : Symbol(v, Decl(override1.ts, 14, 17))
38+
>foo : Symbol(C.foo, Decl(override1.ts, 15, 9))
39+
>v : Symbol(v, Decl(override1.ts, 16, 17))
40+
41+
override toString() { return ''; }
42+
>toString : Symbol(C.toString, Decl(override1.ts, 16, 30))
3743
}
3844

3945
function f () {
40-
>f : Symbol(f, Decl(override1.ts, 15, 1))
46+
>f : Symbol(f, Decl(override1.ts, 19, 1))
4147

4248
return class extends B {
4349
>B : Symbol(B, Decl(override1.ts, 0, 0))
4450

4551
override foo (v: string) {}
46-
>foo : Symbol((Anonymous class).foo, Decl(override1.ts, 18, 28))
47-
>v : Symbol(v, Decl(override1.ts, 19, 22))
52+
>foo : Symbol((Anonymous class).foo, Decl(override1.ts, 22, 28))
53+
>v : Symbol(v, Decl(override1.ts, 23, 22))
4854

4955
fooo (v: string) {}
50-
>fooo : Symbol((Anonymous class).fooo, Decl(override1.ts, 19, 35))
51-
>v : Symbol(v, Decl(override1.ts, 21, 14))
56+
>fooo : Symbol((Anonymous class).fooo, Decl(override1.ts, 23, 35))
57+
>v : Symbol(v, Decl(override1.ts, 25, 14))
5258

5359
override bar(v: string) {}
54-
>bar : Symbol((Anonymous class).bar, Decl(override1.ts, 21, 27))
55-
>v : Symbol(v, Decl(override1.ts, 23, 21))
60+
>bar : Symbol((Anonymous class).bar, Decl(override1.ts, 25, 27))
61+
>v : Symbol(v, Decl(override1.ts, 27, 21))
5662
}
5763
}
5864

5965
class E extends (class {
60-
>E : Symbol(E, Decl(override1.ts, 25, 1))
66+
>E : Symbol(E, Decl(override1.ts, 29, 1))
6167

6268
foo () { }
63-
>foo : Symbol((Anonymous class).foo, Decl(override1.ts, 27, 24))
69+
>foo : Symbol((Anonymous class).foo, Decl(override1.ts, 31, 24))
6470

6571
bar () { }
66-
>bar : Symbol((Anonymous class).bar, Decl(override1.ts, 28, 14))
72+
>bar : Symbol((Anonymous class).bar, Decl(override1.ts, 32, 14))
6773

6874
}) {
6975
override foo () { }
70-
>foo : Symbol(E.foo, Decl(override1.ts, 30, 4))
76+
>foo : Symbol(E.foo, Decl(override1.ts, 34, 4))
7177

7278
bar () { }
73-
>bar : Symbol(E.bar, Decl(override1.ts, 31, 23))
79+
>bar : Symbol(E.bar, Decl(override1.ts, 35, 23))
7480

7581
baz() {}
76-
>baz : Symbol(E.baz, Decl(override1.ts, 32, 14))
82+
>baz : Symbol(E.baz, Decl(override1.ts, 36, 14))
7783

7884
override bazz () {}
79-
>bazz : Symbol(E.bazz, Decl(override1.ts, 34, 12))
85+
>bazz : Symbol(E.bazz, Decl(override1.ts, 38, 12))
8086
}
8187

8288
function ff () {
83-
>ff : Symbol(ff, Decl(override1.ts, 37, 1))
89+
>ff : Symbol(ff, Decl(override1.ts, 41, 1))
8490

8591
return class {
8692
override foo () {}
87-
>foo : Symbol((Anonymous class).foo, Decl(override1.ts, 40, 18))
93+
>foo : Symbol((Anonymous class).foo, Decl(override1.ts, 44, 18))
8894
}
8995
}

Diff for: tests/baselines/reference/override1.types

+8
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ class D extends B {
2626
override bar(v: string) {}
2727
>bar : (v: string) => void
2828
>v : string
29+
30+
override toString() { return ''; }
31+
>toString : () => string
32+
>'' : ""
2933
}
3034

3135
class C {
@@ -34,6 +38,10 @@ class C {
3438
override foo(v: string) {}
3539
>foo : (v: string) => void
3640
>v : string
41+
42+
override toString() { return ''; }
43+
>toString : () => string
44+
>'' : ""
3745
}
3846

3947
function f () {

Diff for: tests/baselines/reference/override5.errors.txt

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ tests/cases/conformance/override/override5.ts(25,14): error TS1029: 'public' mod
66
tests/cases/conformance/override/override5.ts(27,5): error TS1089: 'override' modifier cannot appear on a constructor declaration.
77
tests/cases/conformance/override/override5.ts(39,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
88
tests/cases/conformance/override/override5.ts(44,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
9-
tests/cases/conformance/override/override5.ts(44,23): error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
10-
tests/cases/conformance/override/override5.ts(45,23): error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
9+
tests/cases/conformance/override/override5.ts(44,23): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
10+
tests/cases/conformance/override/override5.ts(45,23): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
1111

1212

1313
==== tests/cases/conformance/override/override5.ts (10 errors) ====
@@ -72,10 +72,10 @@ tests/cases/conformance/override/override5.ts(45,23): error TS4112: This member
7272
~~~~~~~~
7373
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
7474
~
75-
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
75+
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
7676
abstract override b(): void;
7777
~
78-
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
78+
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
7979
}
8080

8181
class ADD extends AD {

Diff for: tests/baselines/reference/override7.errors.txt

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ tests/cases/conformance/override/override7.ts(22,21): error TS4113: This member
99
tests/cases/conformance/override/override7.ts(24,5): error TS1089: 'override' modifier cannot appear on a constructor declaration.
1010
tests/cases/conformance/override/override7.ts(36,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
1111
tests/cases/conformance/override/override7.ts(41,14): error TS1029: 'abstract' modifier must precede 'override' modifier.
12-
tests/cases/conformance/override/override7.ts(41,23): error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
13-
tests/cases/conformance/override/override7.ts(42,23): error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
12+
tests/cases/conformance/override/override7.ts(41,23): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
13+
tests/cases/conformance/override/override7.ts(42,23): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
1414

1515

1616
==== tests/cases/conformance/override/override7.ts (13 errors) ====
@@ -78,10 +78,10 @@ tests/cases/conformance/override/override7.ts(42,23): error TS4112: This member
7878
~~~~~~~~
7979
!!! error TS1029: 'abstract' modifier must precede 'override' modifier.
8080
~
81-
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
81+
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
8282
abstract override b(): void;
8383
~
84-
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'AND' does not extend another class.
84+
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
8585
}
8686

8787
class ADD extends AD {

Diff for: tests/baselines/reference/overrideWithoutNoImplicitOverride1.errors.txt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
tests/cases/conformance/override/overrideWithoutNoImplicitOverride1.ts(2,14): error TS4112: This member cannot have an 'override' modifier because its containing class 'AmbientClass' does not extend another class.
2-
tests/cases/conformance/override/overrideWithoutNoImplicitOverride1.ts(6,14): error TS4112: This member cannot have an 'override' modifier because its containing class 'NonAmbientClass' does not extend another class.
1+
tests/cases/conformance/override/overrideWithoutNoImplicitOverride1.ts(2,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
2+
tests/cases/conformance/override/overrideWithoutNoImplicitOverride1.ts(6,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
33
tests/cases/conformance/override/overrideWithoutNoImplicitOverride1.ts(18,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'AmbientBase'.
44
tests/cases/conformance/override/overrideWithoutNoImplicitOverride1.ts(31,18): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'AmbientBase'.
55
tests/cases/conformance/override/overrideWithoutNoImplicitOverride1.ts(44,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'NonAmbientBase'.
@@ -9,13 +9,13 @@ tests/cases/conformance/override/overrideWithoutNoImplicitOverride1.ts(44,14): e
99
export declare class AmbientClass {
1010
override yadda(): void;
1111
~~~~~
12-
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'AmbientClass' does not extend another class.
12+
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
1313
}
1414

1515
export class NonAmbientClass {
1616
override yadda(): void {}
1717
~~~~~
18-
!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'NonAmbientClass' does not extend another class.
18+
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Object'.
1919
}
2020

2121
/////

0 commit comments

Comments
 (0)