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.
This commit is contained in:
Nathan Shively-Sanders 2015-10-21 16:04:40 -07:00
parent 41d4e82068
commit f16a969856

View File

@ -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(<InterfaceDeclaration>declaration)) {
for (let node of getInterfaceBaseTypeNodes(<InterfaceDeclaration>declaration)) {