@@ -18334,7 +18334,7 @@ namespace ts {
18334
18334
for (const prop of getPropertiesOfObjectType(type)) {
18335
18335
properties[prop.name] = prop;
18336
18336
}
18337
- checkImplicitPropertyMemberOverrides (type, properties);
18337
+ checkAugmentedPropertyMemberOverrides (type, properties);
18338
18338
}
18339
18339
18340
18340
const implementedTypeNodes = getClassImplementsHeritageClauseElements(node);
@@ -18388,40 +18388,53 @@ namespace ts {
18388
18388
return forEach(symbol.declarations, d => isClassLike(d) ? d : undefined);
18389
18389
}
18390
18390
18391
- function checkImplicitPropertyMemberOverrides (type: InterfaceType, propertiesToCheck: Map<Symbol>): void {
18391
+ function checkAugmentedPropertyMemberOverrides (type: InterfaceType, propertiesToCheck: Map<Symbol>): void {
18392
18392
// If the class does not explicitly declare 'extends Object',
18393
18393
// declarations that mask 'Object' members ('toString()', 'hasOwnProperty()', etc...)
18394
18394
// are considered here.
18395
+
18396
+ // check is disabled in ambient contexts
18397
+ if (isInAmbientContext(type.symbol.valueDeclaration)) {
18398
+ return;
18399
+ }
18400
+
18395
18401
const objectType = getSymbol(globals, "Object", SymbolFlags.Type);
18396
18402
if (!objectType) {
18397
18403
return;
18398
18404
}
18405
+
18399
18406
for (const name in propertiesToCheck) {
18400
18407
const derived = getTargetSymbol(propertiesToCheck[name]);
18401
18408
const derivedDeclarationFlags = getDeclarationModifierFlagsFromSymbol(derived);
18402
18409
const found = objectType.members[name];
18403
18410
if (found) {
18404
18411
if (compilerOptions.noImplicitOverride) {
18405
18412
const foundSymbol = getTargetSymbol(found);
18406
- let detail = "masks Object." + symbolToString(found);
18407
- // assert that the type of the derived
18408
- // property matches that of the base property.
18413
+ let errorInfo = chainDiagnosticMessages(
18414
+ undefined,
18415
+ Diagnostics.Class_member_0_must_be_marked_override_when_noImplicitOverride_is_enabled_augmented_from_Object_1,
18416
+ symbolToString(derived),
18417
+ symbolToString(found)
18418
+ );
18409
18419
if (!isPropertyIdenticalTo(derived, foundSymbol)) {
18410
- detail += "). The override declaration ("
18411
- + typeToString(getTypeOfSymbol(derived))
18412
- + ") also has a different type signature than the original ("
18413
- + typeToString(getTypeOfSymbol(foundSymbol));
18420
+ errorInfo = chainDiagnosticMessages(
18421
+ errorInfo,
18422
+ Diagnostics.Type_0_is_not_assignable_to_type_1,
18423
+ typeToString(getTypeOfSymbol(derived)),
18424
+ typeToString(getTypeOfSymbol(foundSymbol))
18425
+ );
18414
18426
}
18415
- error(derived.valueDeclaration.name, Diagnostics.Class_member_0_must_be_marked_override_when_noImplicitOverride_is_enabled_1,
18416
- symbolToString(derived), detail);
18427
+ diagnostics.add(createDiagnosticForNodeFromMessageChain(derived.valueDeclaration.name, errorInfo));
18417
18428
}
18418
18429
}
18419
18430
// No matching property found on the object type. It
18420
18431
// is an error for the derived property to falsely
18421
18432
// claim 'override'.
18422
18433
else if (derivedDeclarationFlags & ModifierFlags.Override) {
18423
- error(derived.valueDeclaration.name, Diagnostics.Class_member_0_was_marked_override_but_no_matching_definition_was_found_in_any_supertype_of_1,
18424
- symbolToString(derived), typeToString(type));
18434
+ error(derived.valueDeclaration.name,
18435
+ Diagnostics.Class_member_0_was_marked_override_but_no_matching_declaration_was_found_in_any_supertype_of_1,
18436
+ symbolToString(derived),
18437
+ typeToString(type));
18425
18438
}
18426
18439
}
18427
18440
}
@@ -18450,6 +18463,8 @@ namespace ts {
18450
18463
onlyInDerived[prop.name] = prop;
18451
18464
}
18452
18465
18466
+ const ambient = isInAmbientContext(type.symbol.valueDeclaration);
18467
+
18453
18468
const baseProperties = getPropertiesOfObjectType(baseType);
18454
18469
for (const baseProperty of baseProperties) {
18455
18470
const base = getTargetSymbol(baseProperty);
@@ -18507,10 +18522,13 @@ namespace ts {
18507
18522
// Before accepting the correct case, ensure 'override' is marked if --noImplicitOverride is true.
18508
18523
// Abstract members are an exception as override checks are suspended until the implementation solidifies.
18509
18524
if (compilerOptions.noImplicitOverride
18525
+ && !ambient
18510
18526
&& !(derivedDeclarationFlags & ModifierFlags.Abstract)
18511
18527
&& !(derivedDeclarationFlags & ModifierFlags.Override)) {
18512
- error(derived.valueDeclaration.name, Diagnostics.Class_member_0_must_be_marked_override_when_noImplicitOverride_is_enabled_1,
18513
- symbolToString(derived), "inherited from " + typeToString(baseType));
18528
+ error(derived.valueDeclaration.name,
18529
+ Diagnostics.Class_member_0_must_be_marked_override_when_noImplicitOverride_is_enabled_augmented_from_Object_1,
18530
+ symbolToString(derived),
18531
+ typeToString(baseType));
18514
18532
}
18515
18533
18516
18534
continue;
@@ -18541,7 +18559,7 @@ namespace ts {
18541
18559
}
18542
18560
}
18543
18561
18544
- checkImplicitPropertyMemberOverrides (type, onlyInDerived);
18562
+ checkAugmentedPropertyMemberOverrides (type, onlyInDerived);
18545
18563
}
18546
18564
18547
18565
function isAccessor(kind: SyntaxKind): boolean {
@@ -21030,9 +21048,6 @@ namespace ts {
21030
21048
else if (flags & ModifierFlags.Async) {
21031
21049
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "async");
21032
21050
}
21033
- else if (flags & ModifierFlags.Override) {
21034
- return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "override");
21035
- }
21036
21051
else if (node.parent.kind === SyntaxKind.ModuleBlock || node.parent.kind === SyntaxKind.SourceFile) {
21037
21052
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, text);
21038
21053
}
@@ -21044,6 +21059,14 @@ namespace ts {
21044
21059
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "abstract");
21045
21060
}
21046
21061
}
21062
+ else if (flags & ModifierFlags.Override) {
21063
+ if (modifier.kind === SyntaxKind.PrivateKeyword) {
21064
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, text, "override");
21065
+ }
21066
+ else {
21067
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "override");
21068
+ }
21069
+ }
21047
21070
flags |= modifierToFlag(modifier.kind);
21048
21071
break;
21049
21072
@@ -21066,9 +21089,6 @@ namespace ts {
21066
21089
else if (flags & ModifierFlags.Abstract) {
21067
21090
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
21068
21091
}
21069
- else if (flags & ModifierFlags.Override) {
21070
- return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "override");
21071
- }
21072
21092
flags |= ModifierFlags.Static;
21073
21093
lastStatic = modifier;
21074
21094
break;
@@ -21131,20 +21151,23 @@ namespace ts {
21131
21151
if (flags & ModifierFlags.Abstract) {
21132
21152
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "abstract");
21133
21153
}
21134
- if (node.kind !== SyntaxKind.ClassDeclaration) {
21154
+ else if (node.kind !== SyntaxKind.ClassDeclaration) {
21135
21155
if (node.kind !== SyntaxKind.MethodDeclaration &&
21136
21156
node.kind !== SyntaxKind.PropertyDeclaration &&
21137
21157
node.kind !== SyntaxKind.GetAccessor &&
21138
21158
node.kind !== SyntaxKind.SetAccessor) {
21139
- return grammarErrorOnNode(modifier, Diagnostics.abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration );
21159
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_can_only_appear_on_a_class_method_or_property_declaration, "abstract" );
21140
21160
}
21141
- if (!(node.parent.kind === SyntaxKind.ClassDeclaration && getModifierFlags(node.parent) & ModifierFlags.Abstract)) {
21161
+ else if (!(node.parent.kind === SyntaxKind.ClassDeclaration && getModifierFlags(node.parent) & ModifierFlags.Abstract)) {
21142
21162
return grammarErrorOnNode(modifier, Diagnostics.Abstract_methods_can_only_appear_within_an_abstract_class);
21143
21163
}
21144
- if (flags & ModifierFlags.Static) {
21164
+ else if (flags & ModifierFlags.Override) {
21165
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "override", "abstract");
21166
+ }
21167
+ else if (flags & ModifierFlags.Static) {
21145
21168
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
21146
21169
}
21147
- if (flags & ModifierFlags.Private) {
21170
+ else if (flags & ModifierFlags.Private) {
21148
21171
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "private", "abstract");
21149
21172
}
21150
21173
}
@@ -21157,17 +21180,33 @@ namespace ts {
21157
21180
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "override");
21158
21181
}
21159
21182
else if (flags & ModifierFlags.Static) {
21160
- return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier , "static ", "override ");
21183
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier , "override ", "static ");
21161
21184
}
21162
- else if (flags & ModifierFlags.Private) {
21163
- return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "private", "override");
21185
+ else if (flags & ModifierFlags.Async) {
21186
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "async");
21187
+ }
21188
+ else if (flags & ModifierFlags.Readonly) {
21189
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "readonly");
21164
21190
}
21165
21191
else if (flags & ModifierFlags.Abstract) {
21166
21192
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "abstract", "override");
21167
21193
}
21194
+ else if (flags & ModifierFlags.Private) {
21195
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "private", "override");
21196
+ }
21197
+ else if (node.kind === SyntaxKind.Parameter) {
21198
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_parameter, "override");
21199
+ }
21168
21200
else if (node.parent.kind === SyntaxKind.ModuleBlock || node.parent.kind === SyntaxKind.SourceFile) {
21169
21201
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, "override");
21170
21202
}
21203
+ else if (node.kind !== SyntaxKind.MethodDeclaration &&
21204
+ node.kind !== SyntaxKind.PropertyDeclaration &&
21205
+ node.kind !== SyntaxKind.GetAccessor &&
21206
+ node.kind !== SyntaxKind.SetAccessor) {
21207
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_can_only_appear_on_a_class_method_or_property_declaration, "override");
21208
+ }
21209
+
21171
21210
flags |= ModifierFlags.Override;
21172
21211
break;
21173
21212
@@ -21191,7 +21230,7 @@ namespace ts {
21191
21230
if (flags & ModifierFlags.Static) {
21192
21231
return grammarErrorOnNode(lastStatic, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "static");
21193
21232
}
21194
- if (flags & ModifierFlags.Abstract) {
21233
+ else if (flags & ModifierFlags.Abstract) {
21195
21234
return grammarErrorOnNode(lastStatic, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "abstract");
21196
21235
}
21197
21236
else if (flags & ModifierFlags.Async) {
0 commit comments