@@ -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