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:
Iván
2023-03-28 11:54:36 -03:00
committed by GitHub
parent 647c587e46
commit 2b57a88b72
13 changed files with 86 additions and 59 deletions

View File

@@ -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)));
}
}
}

View File

@@ -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
}
}

View File

@@ -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({