Addressing CR feedback

This commit is contained in:
Anders Hejlsberg 2015-04-21 17:39:50 -07:00
parent cd48b965f8
commit 782c55f771
2 changed files with 26 additions and 28 deletions

View file

@ -2635,32 +2635,28 @@ module ts {
}
}
function getDeclaredPropertiesOfClassOrInterface(type: InterfaceType): Symbol[] {
resolveDeclaredMembers(type);
return type.declaredProperties;
}
function resolveDeclaredMembers(type: InterfaceType) {
if (!type.declaredProperties) {
function resolveDeclaredMembers(type: InterfaceType): InterfaceTypeWithDeclaredMembers {
if (!(<InterfaceTypeWithDeclaredMembers>type).declaredProperties) {
var symbol = type.symbol;
type.declaredProperties = getNamedMembers(symbol.members);
type.declaredCallSignatures = getSignaturesOfSymbol(symbol.members["__call"]);
type.declaredConstructSignatures = getSignaturesOfSymbol(symbol.members["__new"]);
type.declaredStringIndexType = getIndexTypeOfSymbol(symbol, IndexKind.String);
type.declaredNumberIndexType = getIndexTypeOfSymbol(symbol, IndexKind.Number);
(<InterfaceTypeWithDeclaredMembers>type).declaredProperties = getNamedMembers(symbol.members);
(<InterfaceTypeWithDeclaredMembers>type).declaredCallSignatures = getSignaturesOfSymbol(symbol.members["__call"]);
(<InterfaceTypeWithDeclaredMembers>type).declaredConstructSignatures = getSignaturesOfSymbol(symbol.members["__new"]);
(<InterfaceTypeWithDeclaredMembers>type).declaredStringIndexType = getIndexTypeOfSymbol(symbol, IndexKind.String);
(<InterfaceTypeWithDeclaredMembers>type).declaredNumberIndexType = getIndexTypeOfSymbol(symbol, IndexKind.Number);
}
return <InterfaceTypeWithDeclaredMembers>type;
}
function resolveClassOrInterfaceMembers(type: InterfaceType): void {
resolveDeclaredMembers(type);
let members = type.symbol.members;
let callSignatures = type.declaredCallSignatures;
let constructSignatures = type.declaredConstructSignatures;
let stringIndexType = type.declaredStringIndexType;
let numberIndexType = type.declaredNumberIndexType;
let baseTypes = getBaseTypes(type);
let target = resolveDeclaredMembers(type);
let members = target.symbol.members;
let callSignatures = target.declaredCallSignatures;
let constructSignatures = target.declaredConstructSignatures;
let stringIndexType = target.declaredStringIndexType;
let numberIndexType = target.declaredNumberIndexType;
let baseTypes = getBaseTypes(target);
if (baseTypes.length) {
members = createSymbolTable(type.declaredProperties);
members = createSymbolTable(target.declaredProperties);
for (let baseType of baseTypes) {
addInheritedMembers(members, getPropertiesOfObjectType(baseType));
callSignatures = concatenate(callSignatures, getSignaturesOfType(baseType, SignatureKind.Call));
@ -2673,8 +2669,7 @@ module ts {
}
function resolveTypeReferenceMembers(type: TypeReference): void {
let target = type.target;
resolveDeclaredMembers(target);
let target = resolveDeclaredMembers(type.target);
let mapper = createTypeMapper(target.typeParameters, type.typeArguments);
let members = createInstantiatedSymbolTable(target.declaredProperties, mapper);
let callSignatures = instantiateList(target.declaredCallSignatures, mapper, instantiateSignature);
@ -10139,7 +10134,7 @@ module ts {
}
let seen: Map<{ prop: Symbol; containingType: Type }> = {};
forEach(getDeclaredPropertiesOfClassOrInterface(type), p => { seen[p.name] = { prop: p, containingType: type }; });
forEach(resolveDeclaredMembers(type).declaredProperties, p => { seen[p.name] = { prop: p, containingType: type }; });
let ok = true;
for (let base of baseTypes) {

View file

@ -1485,17 +1485,20 @@ module ts {
// Class and interface types (TypeFlags.Class and TypeFlags.Interface)
export interface InterfaceType extends ObjectType {
typeParameters: TypeParameter[]; // Type parameters (undefined if non-generic)
declaredProperties: Symbol[]; // Declared members (computed by resolveDeclaredMembers)
declaredCallSignatures: Signature[]; // Declared call signatures (computed by resolveDeclaredMembers)
declaredConstructSignatures: Signature[]; // Declared construct signatures (computed by resolveDeclaredMembers)
declaredStringIndexType: Type; // Declared string index type (computed by resolveDeclaredMembers)
declaredNumberIndexType: Type; // Declared numeric index type (computed by resolveDeclaredMembers)
}
export interface InterfaceTypeWithBaseTypes extends InterfaceType {
baseTypes: ObjectType[];
}
export interface InterfaceTypeWithDeclaredMembers extends InterfaceType {
declaredProperties: Symbol[]; // Declared members
declaredCallSignatures: Signature[]; // Declared call signatures
declaredConstructSignatures: Signature[]; // Declared construct signatures
declaredStringIndexType: Type; // Declared string index type
declaredNumberIndexType: Type; // Declared numeric index type
}
// Type references (TypeFlags.Reference)
export interface TypeReference extends ObjectType {
target: GenericType; // Type reference target