From f16a9698566a4d6a83d1175778fb5bf4bc8aaa73 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 21 Oct 2015 16:04:40 -0700 Subject: [PATCH] `getBaseTypes` handles interfaces merged w/classes Previously it assumed that if a class was present in the merge, only the class base types needed to be used. This became false when classes and interfaces could be merged. --- src/compiler/checker.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5cdbe66bb11..18443e5997b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2846,22 +2846,24 @@ namespace ts { } function getBaseTypes(type: InterfaceType): ObjectType[] { + let isClass = type.symbol.flags & SymbolFlags.Class; + let isInterface = type.symbol.flags & SymbolFlags.Interface; if (!type.resolvedBaseTypes) { - if (type.symbol.flags & SymbolFlags.Class) { + if (!isClass && !isInterface) { + Debug.fail("type must be class or interface"); + } + if (isClass) { resolveBaseTypesOfClass(type); } - else if (type.symbol.flags & SymbolFlags.Interface) { + if (isInterface) { resolveBaseTypesOfInterface(type); } - else { - Debug.fail("type must be class or interface"); - } } return type.resolvedBaseTypes; } function resolveBaseTypesOfClass(type: InterfaceType): void { - type.resolvedBaseTypes = emptyArray; + type.resolvedBaseTypes = type.resolvedBaseTypes || []; let baseContructorType = getBaseConstructorTypeOfClass(type); if (!(baseContructorType.flags & TypeFlags.ObjectType)) { return; @@ -2897,11 +2899,11 @@ namespace ts { typeToString(type, /*enclosingDeclaration*/ undefined, TypeFormatFlags.WriteArrayAsGenericType)); return; } - type.resolvedBaseTypes = [baseType]; + type.resolvedBaseTypes.push(baseType); } function resolveBaseTypesOfInterface(type: InterfaceType): void { - type.resolvedBaseTypes = []; + type.resolvedBaseTypes = type.resolvedBaseTypes || []; for (let declaration of type.symbol.declarations) { if (declaration.kind === SyntaxKind.InterfaceDeclaration && getInterfaceBaseTypeNodes(declaration)) { for (let node of getInterfaceBaseTypeNodes(declaration)) {