mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-31 18:10:56 -05:00
Use related spans for "implement abstract class" errors (#48030)
Co-authored-by: Gabriela Araujo Britto <gabrielaa@microsoft.com> Co-authored-by: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com>
This commit is contained in:
@@ -43138,6 +43138,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
|
||||
// NOTE: assignability is checked in checkClassDeclaration
|
||||
const baseProperties = getPropertiesOfType(baseType);
|
||||
let inheritedAbstractMemberNotImplementedError: Diagnostic | undefined;
|
||||
basePropertyCheck: for (const baseProperty of baseProperties) {
|
||||
const base = getTargetSymbol(baseProperty);
|
||||
|
||||
@@ -43176,13 +43177,28 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
}
|
||||
}
|
||||
|
||||
if (!inheritedAbstractMemberNotImplementedError) {
|
||||
inheritedAbstractMemberNotImplementedError = error(
|
||||
derivedClassDecl,
|
||||
Diagnostics.Non_abstract_class_0_does_not_implement_all_abstract_members_of_1,
|
||||
typeToString(type), typeToString(baseType));
|
||||
|
||||
}
|
||||
if (derivedClassDecl.kind === SyntaxKind.ClassExpression) {
|
||||
error(derivedClassDecl, Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1,
|
||||
symbolToString(baseProperty), typeToString(baseType));
|
||||
addRelatedInfo(
|
||||
inheritedAbstractMemberNotImplementedError,
|
||||
createDiagnosticForNode(
|
||||
baseProperty.valueDeclaration ?? (baseProperty.declarations && first(baseProperty.declarations)) ?? derivedClassDecl,
|
||||
Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1,
|
||||
symbolToString(baseProperty), typeToString(baseType)));
|
||||
}
|
||||
else {
|
||||
error(derivedClassDecl, Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2,
|
||||
typeToString(type), symbolToString(baseProperty), typeToString(baseType));
|
||||
addRelatedInfo(
|
||||
inheritedAbstractMemberNotImplementedError,
|
||||
createDiagnosticForNode(
|
||||
baseProperty.valueDeclaration ?? (baseProperty.declarations && first(baseProperty.declarations)) ?? derivedClassDecl,
|
||||
Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2,
|
||||
typeToString(type), symbolToString(baseProperty), typeToString(baseType)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7760,5 +7760,9 @@
|
||||
"Compiler option '{0}' cannot be given an empty string.": {
|
||||
"category": "Error",
|
||||
"code": 18051
|
||||
},
|
||||
"Non-abstract class '{0}' does not implement all abstract members of '{1}'": {
|
||||
"category": "Error",
|
||||
"code": 18052
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,8 +26,7 @@ import {
|
||||
} from "../_namespaces/ts.codefix";
|
||||
|
||||
const errorCodes = [
|
||||
Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2.code,
|
||||
Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1.code,
|
||||
Diagnostics.Non_abstract_class_0_does_not_implement_all_abstract_members_of_1.code,
|
||||
];
|
||||
const fixId = "fixClassDoesntImplementInheritedAbstractMember";
|
||||
registerCodeFix({
|
||||
|
||||
Reference in New Issue
Block a user