From add85e182810a3922087bb10679ebea39e0cded0 Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Thu, 16 Sep 2021 06:19:58 +0800 Subject: [PATCH] fix: add corresponding message for override error in js files (#45656) * fix: add override errors for js class members * fix: test failures of js override error message * update diagnostic messages * fix: test errors * fix: lint errors --- src/compiler/checker.ts | 31 ++++++++++++++++--- src/compiler/diagnosticMessages.json | 21 ++++++++++++- src/services/codefixes/fixSpelling.ts | 1 + .../reference/jsdocOverrideTag1.errors.txt | 12 +++---- .../reference/override_js2.errors.txt | 16 +++++----- .../reference/override_js4.errors.txt | 4 +-- 6 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e70e6502f8..c204ef7d30 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -38042,6 +38042,7 @@ namespace ts { function checkClassMember(member: ClassElement | ParameterPropertyDeclaration, memberIsParameterProperty?: boolean) { const hasOverride = hasOverrideModifier(member); const hasStatic = isStatic(member); + const isJs = isInJSFile(member); if (baseWithThis && (hasOverride || compilerOptions.noImplicitOverride)) { const declaredProp = member.name && getSymbolAtLocation(member.name) || getSymbolAtLocation(member); if (!declaredProp) { @@ -38057,8 +38058,19 @@ namespace ts { if (prop && !baseProp && hasOverride) { const suggestion = getSuggestedSymbolForNonexistentClassMember(symbolName(declaredProp), baseType); suggestion ? - error(member, Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1, baseClassName, symbolToString(suggestion)) : - error(member, Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0, baseClassName); + error( + member, + isJs ? + Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1 : + Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1, + baseClassName, + symbolToString(suggestion)) : + error( + member, + isJs ? + Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0 : + Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0, + baseClassName); } else if (prop && baseProp?.declarations && compilerOptions.noImplicitOverride && !nodeInAmbientContext) { const baseHasAbstract = some(baseProp.declarations, hasAbstractModifier); @@ -38068,8 +38080,12 @@ namespace ts { if (!baseHasAbstract) { const diag = memberIsParameterProperty ? - Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0 : - Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0; + isJs ? + Diagnostics.This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0 : + Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0 : + isJs ? + Diagnostics.This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0 : + Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0; error(member, diag, baseClassName); } else if (hasAbstractModifier(member) && baseHasAbstract) { @@ -38079,7 +38095,12 @@ namespace ts { } else if (hasOverride) { const className = typeToString(type); - error(member, Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class, className); + error( + member, + isJs ? + Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class : + Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class, + className); } } } diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 8c10db3a8b..b68a1b6ba2 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3709,7 +3709,26 @@ "category": "Error", "code": 4118 }, - + "This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class '{0}'.": { + "category": "Error", + "code": 4119 + }, + "This parameter property must have a JSDoc comment with an '@override' tag because it overrides a member in the base class '{0}'.": { + "category": "Error", + "code": 4120 + }, + "This member cannot have a JSDoc comment with an '@override' tag because its containing class '{0}' does not extend another class.": { + "category": "Error", + "code": 4121 + }, + "This member cannot have a JSDoc comment with an '@override' tag because it is not declared in the base class '{0}'.": { + "category": "Error", + "code": 4122 + }, + "This member cannot have a JSDoc comment with an 'override' tag because it is not declared in the base class '{0}'. Did you mean '{1}'?": { + "category": "Error", + "code": 4123 + }, "The current host does not support the '{0}' option.": { "category": "Error", "code": 5001 diff --git a/src/services/codefixes/fixSpelling.ts b/src/services/codefixes/fixSpelling.ts index 457ccc5ee6..99ccc51e83 100644 --- a/src/services/codefixes/fixSpelling.ts +++ b/src/services/codefixes/fixSpelling.ts @@ -10,6 +10,7 @@ namespace ts.codefix { Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code, Diagnostics._0_has_no_exported_member_named_1_Did_you_mean_2.code, Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1.code, + Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1.code, // for JSX class components Diagnostics.No_overload_matches_this_call.code, // for JSX FC diff --git a/tests/baselines/reference/jsdocOverrideTag1.errors.txt b/tests/baselines/reference/jsdocOverrideTag1.errors.txt index 3bc565a174..4765116859 100644 --- a/tests/baselines/reference/jsdocOverrideTag1.errors.txt +++ b/tests/baselines/reference/jsdocOverrideTag1.errors.txt @@ -1,6 +1,6 @@ -tests/cases/conformance/jsdoc/0.js(27,5): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'A'. -tests/cases/conformance/jsdoc/0.js(32,5): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'A'. -tests/cases/conformance/jsdoc/0.js(40,5): error TS4112: This member cannot have an 'override' modifier because its containing class 'C' does not extend another class. +tests/cases/conformance/jsdoc/0.js(27,5): error TS4119: This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class 'A'. +tests/cases/conformance/jsdoc/0.js(32,5): error TS4122: This member cannot have a JSDoc comment with an '@override' tag because it is not declared in the base class 'A'. +tests/cases/conformance/jsdoc/0.js(40,5): error TS4121: This member cannot have a JSDoc comment with an '@override' tag because its containing class 'C' does not extend another class. ==== tests/cases/conformance/jsdoc/0.js (3 errors) ==== @@ -32,14 +32,14 @@ tests/cases/conformance/jsdoc/0.js(40,5): error TS4112: This member cannot have bar () { ~~~ -!!! error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'A'. +!!! error TS4119: This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class 'A'. } /** @override */ baz () { ~~~ -!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'A'. +!!! error TS4122: This member cannot have a JSDoc comment with an '@override' tag because it is not declared in the base class 'A'. } } @@ -49,7 +49,7 @@ tests/cases/conformance/jsdoc/0.js(40,5): error TS4112: This member cannot have /** @override */ foo () { ~~~ -!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'C' does not extend another class. +!!! error TS4121: This member cannot have a JSDoc comment with an '@override' tag because its containing class 'C' does not extend another class. } } \ No newline at end of file diff --git a/tests/baselines/reference/override_js2.errors.txt b/tests/baselines/reference/override_js2.errors.txt index 54254dbdc7..e1ebe7edee 100644 --- a/tests/baselines/reference/override_js2.errors.txt +++ b/tests/baselines/reference/override_js2.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/override/a.js(7,5): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'B'. -tests/cases/conformance/override/a.js(11,5): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'. -tests/cases/conformance/override/a.js(17,5): error TS4112: This member cannot have an 'override' modifier because its containing class 'C' does not extend another class. -tests/cases/conformance/override/a.js(19,5): error TS4112: This member cannot have an 'override' modifier because its containing class 'C' does not extend another class. +tests/cases/conformance/override/a.js(7,5): error TS4119: This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class 'B'. +tests/cases/conformance/override/a.js(11,5): error TS4122: This member cannot have a JSDoc comment with an '@override' tag because it is not declared in the base class 'B'. +tests/cases/conformance/override/a.js(17,5): error TS4121: This member cannot have a JSDoc comment with an '@override' tag because its containing class 'C' does not extend another class. +tests/cases/conformance/override/a.js(19,5): error TS4121: This member cannot have a JSDoc comment with an '@override' tag because its containing class 'C' does not extend another class. ==== tests/cases/conformance/override/a.js (4 errors) ==== @@ -13,13 +13,13 @@ tests/cases/conformance/override/a.js(19,5): error TS4112: This member cannot ha class D extends B { foo (v) {} ~~~ -!!! error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'B'. +!!! error TS4119: This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class 'B'. /** @override */ fooo (v) {} /** @override */ bar(v) {} ~~~ -!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'B'. +!!! error TS4122: This member cannot have a JSDoc comment with an '@override' tag because it is not declared in the base class 'B'. } class C { @@ -27,9 +27,9 @@ tests/cases/conformance/override/a.js(19,5): error TS4112: This member cannot ha /** @override */ fooo (v) {} ~~~~ -!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'C' does not extend another class. +!!! error TS4121: This member cannot have a JSDoc comment with an '@override' tag because its containing class 'C' does not extend another class. /** @override */ bar(v) {} ~~~ -!!! error TS4112: This member cannot have an 'override' modifier because its containing class 'C' does not extend another class. +!!! error TS4121: This member cannot have a JSDoc comment with an '@override' tag because its containing class 'C' does not extend another class. } \ No newline at end of file diff --git a/tests/baselines/reference/override_js4.errors.txt b/tests/baselines/reference/override_js4.errors.txt index 5b9b5b97f3..3e685b6c20 100644 --- a/tests/baselines/reference/override_js4.errors.txt +++ b/tests/baselines/reference/override_js4.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/override/a.js(7,5): error TS4117: This member cannot have an 'override' modifier because it is not declared in the base class 'A'. Did you mean 'doSomething'? +tests/cases/conformance/override/a.js(7,5): error TS4123: This member cannot have a JSDoc comment with an 'override' tag because it is not declared in the base class 'A'. Did you mean 'doSomething'? ==== tests/cases/conformance/override/a.js (1 errors) ==== @@ -10,6 +10,6 @@ tests/cases/conformance/override/a.js(7,5): error TS4117: This member cannot hav /** @override */ doSomethang() {} ~~~~~~~~~~~ -!!! error TS4117: This member cannot have an 'override' modifier because it is not declared in the base class 'A'. Did you mean 'doSomething'? +!!! error TS4123: This member cannot have a JSDoc comment with an 'override' tag because it is not declared in the base class 'A'. Did you mean 'doSomething'? } \ No newline at end of file