mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-11 19:27:35 -06:00
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:
parent
41d4e82068
commit
f16a969856
@ -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)) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user