@@ -383,6 +383,7 @@ import {
383383 getTextOfPropertyName,
384384 getThisContainer,
385385 getThisParameter,
386+ getTokenPosOfNode,
386387 getTrailingSemicolonDeferringWriter,
387388 getTypeParameterFromJsDoc,
388389 getUseDefineForClassFields,
@@ -13211,6 +13212,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1321113212 }
1321213213
1321313214 function getBaseTypes(type: InterfaceType): BaseType[] {
13215+ if (!(getObjectFlags(type) & (ObjectFlags.ClassOrInterface | ObjectFlags.Reference))) {
13216+ return emptyArray;
13217+ }
1321413218 if (!type.baseTypesResolved) {
1321513219 if (pushTypeResolution(type, TypeSystemPropertyName.ResolvedBaseTypes)) {
1321613220 if (type.objectFlags & ObjectFlags.Tuple) {
@@ -34448,10 +34452,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3444834452 (flags & ModifierFlags.Abstract) && symbolHasNonMethodDeclaration(prop) &&
3444934453 (isThisProperty(location) || isThisInitializedObjectBindingExpression(location) || isObjectBindingPattern(location.parent) && isThisInitializedDeclaration(location.parent.parent))
3445034454 ) {
34451- const declaringClassDeclaration = getClassLikeDeclarationOfSymbol( getParentOfSymbol(prop)! );
34452- if (declaringClassDeclaration && isNodeUsedDuringClassInitialization(location)) {
34455+ const parentSymbol = getParentOfSymbol(prop);
34456+ if (parentSymbol && parentSymbol.flags & SymbolFlags.Class && isNodeUsedDuringClassInitialization(location)) {
3445334457 if (errorNode) {
34454- error(errorNode, Diagnostics.Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor, symbolToString(prop), getTextOfIdentifierOrLiteral(declaringClassDeclaration.name! ));
34458+ error(errorNode, Diagnostics.Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor, symbolToString(prop), symbolToString(parentSymbol ));
3445534459 }
3445634460 return false;
3445734461 }
@@ -35052,28 +35056,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3505235056 * In that case we won't consider it used before its declaration, because it gets its value from the superclass' declaration.
3505335057 */
3505435058 function isPropertyDeclaredInAncestorClass(prop: Symbol): boolean {
35055- if (!(prop.parent!.flags & SymbolFlags.Class)) {
35056- return false;
35057- }
35058- let classType: InterfaceType | undefined = getTypeOfSymbol(prop.parent!) as InterfaceType;
35059- while (true) {
35060- classType = classType.symbol && getSuperClass(classType) as InterfaceType | undefined;
35061- if (!classType) {
35062- return false;
35063- }
35064- const superProperty = getPropertyOfType(classType, prop.escapedName);
35065- if (superProperty && superProperty.valueDeclaration) {
35066- return true;
35059+ if (prop.parent && prop.parent.flags & SymbolFlags.Class) {
35060+ const baseTypes = getBaseTypes(getDeclaredTypeOfSymbol(prop.parent) as InterfaceType);
35061+ if (baseTypes.length) {
35062+ const superProperty = getPropertyOfType(baseTypes[0], prop.escapedName);
35063+ return !!(superProperty && superProperty.valueDeclaration);
3506735064 }
3506835065 }
35069- }
35070-
35071- function getSuperClass(classType: InterfaceType): Type | undefined {
35072- const x = getBaseTypes(classType);
35073- if (x.length === 0) {
35074- return undefined;
35075- }
35076- return getIntersectionType(x);
35066+ return false;
3507735067 }
3507835068
3507935069 function reportNonexistentProperty(propNode: Identifier | PrivateIdentifier, containingType: Type, isUncheckedJS: boolean) {
@@ -49232,8 +49222,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4923249222
4923349223 const sourceFile = getSourceFileOfNode(node);
4923449224
49235- let start = node.pos ;
49236- let end = node.end ;
49225+ let startNode = node;
49226+ let endNode = node;
4923749227
4923849228 const parent = node.parent;
4923949229 if (canHaveStatements(parent)) {
@@ -49263,13 +49253,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4926349253 reportedUnreachableNodes.add(nextNode);
4926449254 }
4926549255
49266- start = statements[first].pos ;
49267- end = statements[last].end ;
49256+ startNode = statements[first];
49257+ endNode = statements[last];
4926849258 }
4926949259 }
4927049260
49271- start = skipTrivia(sourceFile.text, start );
49272- addErrorOrSuggestion(compilerOptions.allowUnreachableCode === false, createFileDiagnostic(sourceFile, start, end - start, Diagnostics.Unreachable_code_detected));
49261+ const start = getTokenPosOfNode(startNode, sourceFile );
49262+ addErrorOrSuggestion(compilerOptions.allowUnreachableCode === false, createFileDiagnostic(sourceFile, start, endNode. end - start, Diagnostics.Unreachable_code_detected));
4927349263
4927449264 return true;
4927549265 }
0 commit comments