Skip to content

Commit 956b639

Browse files
committed
localize special case (globalArrayType === undefined) in getTypeFromArrayTypeNode
1 parent 442ad4b commit 956b639

1 file changed

Lines changed: 19 additions & 33 deletions

File tree

src/compiler/checker.ts

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,9 @@ module ts {
4343

4444
var globals: SymbolTable = {};
4545

46-
var globalArrayTypeSymbolLinks: SymbolLinks;
47-
4846
var globalObjectType: ObjectType;
4947
var globalFunctionType: ObjectType;
48+
var globalArrayType: ObjectType;
5049
var globalStringType: ObjectType;
5150
var globalNumberType: ObjectType;
5251
var globalBooleanType: ObjectType;
@@ -774,7 +773,7 @@ module ts {
774773
}
775774

776775
function writeTypeReference(type: TypeReference) {
777-
if (type.target === globalArrayTypeSymbolLinks.declaredType && !(flags & TypeFormatFlags.WriteArrayAsGenericType)) {
776+
if (type.target === globalArrayType && !(flags & TypeFormatFlags.WriteArrayAsGenericType)) {
778777
// If we are writing array element type the arrow style signatures are not allowed as
779778
// we need to surround it by curlies, eg. { (): T; }[]; as () => T[] would mean something different
780779
writeType(type.typeArguments[0], /*allowFunctionOrConstructorTypeLiteral*/ false);
@@ -1806,7 +1805,7 @@ module ts {
18061805
function getRestTypeOfSignature(signature: Signature): Type {
18071806
if (signature.hasRestParameter) {
18081807
var type = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]);
1809-
if (type.flags & TypeFlags.Reference && (<TypeReference>type).target === globalArrayTypeSymbolLinks.declaredType) {
1808+
if (type.flags & TypeFlags.Reference && (<TypeReference>type).target === globalArrayType) {
18101809
return (<TypeReference>type).typeArguments[0];
18111810
}
18121811
}
@@ -2017,11 +2016,8 @@ module ts {
20172016
return links.resolvedType;
20182017
}
20192018

2020-
function resolveGlobalTypeSymbol(name: string): Symbol {
2021-
return resolveName(undefined, name, SymbolFlags.Type, Diagnostics.Cannot_find_global_type_0, name);
2022-
}
2019+
function getGlobalType(name: string, arity: number = 0): ObjectType {
20232020

2024-
function resolveGlobalType(symbol: Symbol, arity: number): ObjectType {
20252021
function getTypeDeclaration(symbol: Symbol): Declaration {
20262022
var declarations = symbol.declarations;
20272023
for (var i = 0; i < declarations.length; i++) {
@@ -2036,6 +2032,8 @@ module ts {
20362032
}
20372033
}
20382034
}
2035+
2036+
var symbol = resolveName(undefined, name, SymbolFlags.Type, Diagnostics.Cannot_find_global_type_0, name);
20392037
if (!symbol) {
20402038
return emptyObjectType;
20412039
}
@@ -2051,19 +2049,22 @@ module ts {
20512049
return <ObjectType>type;
20522050
}
20532051

2054-
function getGlobalType(name: string, arity: number = 0): ObjectType {
2055-
return resolveGlobalType(resolveGlobalTypeSymbol(name), arity);
2056-
}
2057-
2058-
function createArrayType(elementType: Type): Type {
2059-
var globalArrayType = globalArrayTypeSymbolLinks.declaredType;
2060-
return globalArrayType !== emptyObjectType ? createTypeReference(<GenericType>globalArrayType, [elementType]) : emptyObjectType;
2052+
function createArrayType(elementType: Type, arrayType?: ObjectType): Type {
2053+
var type = globalArrayType || arrayType;
2054+
return type !== emptyObjectType ? createTypeReference(<GenericType>type, [elementType]) : emptyObjectType;
20612055
}
20622056

20632057
function getTypeFromArrayTypeNode(node: ArrayTypeNode): Type {
20642058
var links = getNodeLinks(node);
20652059
if (!links.resolvedType) {
2066-
links.resolvedType = createArrayType(getTypeFromTypeNode(node.elementType));
2060+
var arrayType = globalArrayType;
2061+
if (!arrayType) {
2062+
var arrayTypeSymbol = resolveName(node, "Array", SymbolFlags.Type, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined);
2063+
Debug.assert(arrayTypeSymbol);
2064+
arrayType = getDeclaredTypeOfSymbol(arrayTypeSymbol);
2065+
Debug.assert(arrayType);
2066+
}
2067+
links.resolvedType = createArrayType(getTypeFromTypeNode(node.elementType), arrayType);
20672068
}
20682069
return links.resolvedType;
20692070
}
@@ -2951,7 +2952,7 @@ module ts {
29512952
}
29522953

29532954
function isArrayType(type: Type): boolean {
2954-
return type.flags & TypeFlags.Reference && (<TypeReference>type).target === globalArrayTypeSymbolLinks.declaredType;
2955+
return type.flags & TypeFlags.Reference && (<TypeReference>type).target === globalArrayType;
29552956
}
29562957

29572958
function getInnermostTypeOfNestedArrayTypes(type: Type): Type {
@@ -6289,22 +6290,7 @@ module ts {
62896290
getSymbolLinks(unknownSymbol).type = unknownType;
62906291
globals[undefinedSymbol.name] = undefinedSymbol;
62916292
// Initialize special types
6292-
// Initialize array type.
6293-
// Note:
6294-
// if user code extends Array type so extension contains signatures that involve arrays (sample below)
6295-
// then just calling getGlobalType(Array) will try to access globalArrayType before it is initialized
6296-
// to handle this instead of storing Array as type we store SymbolLinks for Array symbol and access type as links.declaredType.
6297-
// interface Array<T> { (): any[] }
6298-
//
6299-
var globalArraySymbol = resolveGlobalTypeSymbol("Array");
6300-
if (!globalArraySymbol) {
6301-
globalArrayTypeSymbolLinks = { declaredType: emptyObjectType };
6302-
}
6303-
else {
6304-
globalArrayTypeSymbolLinks = getSymbolLinks(globalArraySymbol);
6305-
globalArrayTypeSymbolLinks.declaredType = resolveGlobalType(globalArraySymbol, 1);
6306-
}
6307-
6293+
globalArrayType = getGlobalType("Array", 1);
63086294
globalObjectType = getGlobalType("Object");
63096295
globalFunctionType = getGlobalType("Function");
63106296
globalStringType = getGlobalType("String");

0 commit comments

Comments
 (0)