@@ -3132,45 +3132,6 @@ module ts {
3132
3132
return ( type . flags & TypeFlags . Anonymous ) && type . symbol && ( type . symbol . flags & SymbolFlags . ObjectLiteral ) ? true : false ;
3133
3133
}
3134
3134
3135
- function getWidenedTypeOfObjectLiteral ( type : Type , supressNoImplicitAnyErrors ?: boolean ) : Type {
3136
- var properties = getPropertiesOfType ( type ) ;
3137
- if ( properties . length ) {
3138
- var widenedTypes : Type [ ] = [ ] ;
3139
- var propTypeWasWidened : boolean = false ;
3140
- forEach ( properties , p => {
3141
- var propType = getTypeOfSymbol ( p ) ;
3142
- var widenedType = getWidenedType ( propType ) ;
3143
- if ( propType !== widenedType ) {
3144
- propTypeWasWidened = true ;
3145
-
3146
- if ( ! supressNoImplicitAnyErrors && program . getCompilerOptions ( ) . noImplicitAny && getInnermostTypeOfNestedArrayTypes ( widenedType ) === anyType ) {
3147
- error ( p . valueDeclaration , Diagnostics . Object_literal_s_property_0_implicitly_has_an_1_type , p . name , typeToString ( widenedType ) ) ;
3148
- }
3149
- }
3150
- widenedTypes . push ( widenedType ) ;
3151
- } ) ;
3152
- if ( propTypeWasWidened ) {
3153
- var members : SymbolTable = { } ;
3154
- var index = 0 ;
3155
- forEach ( properties , p => {
3156
- var symbol = < TransientSymbol > createSymbol ( SymbolFlags . Property | SymbolFlags . Transient , p . name ) ;
3157
- symbol . declarations = p . declarations ;
3158
- symbol . parent = p . parent ;
3159
- symbol . type = widenedTypes [ index ++ ] ;
3160
- symbol . target = p ;
3161
- if ( p . valueDeclaration ) symbol . valueDeclaration = p . valueDeclaration ;
3162
- members [ symbol . name ] = symbol ;
3163
- } ) ;
3164
- var stringIndexType = getIndexTypeOfType ( type , IndexKind . String ) ;
3165
- var numberIndexType = getIndexTypeOfType ( type , IndexKind . Number ) ;
3166
- if ( stringIndexType ) stringIndexType = getWidenedType ( stringIndexType ) ;
3167
- if ( numberIndexType ) numberIndexType = getWidenedType ( numberIndexType ) ;
3168
- type = createAnonymousType ( type . symbol , members , emptyArray , emptyArray , stringIndexType , numberIndexType ) ;
3169
- }
3170
- }
3171
- return type ;
3172
- }
3173
-
3174
3135
function isArrayType ( type : Type ) : boolean {
3175
3136
return type . flags & TypeFlags . Reference && ( < TypeReference > type ) . target === globalArrayType ;
3176
3137
}
@@ -3183,27 +3144,66 @@ module ts {
3183
3144
return type ;
3184
3145
}
3185
3146
3186
- function getWidenedTypeOfArrayLiteral ( type : Type , supressNoImplicitAnyErrors ?: boolean ) : Type {
3187
- var elementType = ( < TypeReference > type ) . typeArguments [ 0 ] ;
3188
- var widenedType = getWidenedType ( elementType , supressNoImplicitAnyErrors ) ;
3189
-
3190
- type = elementType !== widenedType ? createArrayType ( widenedType ) : type ;
3191
-
3192
- return type ;
3193
- }
3194
-
3195
3147
/* If we are widening on a literal, then we may need to the 'node' parameter for reporting purposes */
3196
3148
function getWidenedType ( type : Type , supressNoImplicitAnyErrors ?: boolean ) : Type {
3197
3149
if ( type . flags & ( TypeFlags . Undefined | TypeFlags . Null ) ) {
3198
3150
return anyType ;
3199
3151
}
3200
3152
if ( isTypeOfObjectLiteral ( type ) ) {
3201
- return getWidenedTypeOfObjectLiteral ( type , supressNoImplicitAnyErrors ) ;
3153
+ return getWidenedTypeOfObjectLiteral ( type ) ;
3202
3154
}
3203
3155
if ( isArrayType ( type ) ) {
3204
- return getWidenedTypeOfArrayLiteral ( type , supressNoImplicitAnyErrors ) ;
3156
+ return getWidenedTypeOfArrayLiteral ( type ) ;
3205
3157
}
3206
3158
return type ;
3159
+
3160
+ function getWidenedTypeOfObjectLiteral ( type : Type ) : Type {
3161
+ var properties = getPropertiesOfType ( type ) ;
3162
+ if ( properties . length ) {
3163
+ var widenedTypes : Type [ ] = [ ] ;
3164
+ var propTypeWasWidened : boolean = false ;
3165
+ forEach ( properties , p => {
3166
+ var propType = getTypeOfSymbol ( p ) ;
3167
+ var widenedType = getWidenedType ( propType ) ;
3168
+ if ( propType !== widenedType ) {
3169
+ propTypeWasWidened = true ;
3170
+
3171
+ if ( ! supressNoImplicitAnyErrors && program . getCompilerOptions ( ) . noImplicitAny && getInnermostTypeOfNestedArrayTypes ( widenedType ) === anyType ) {
3172
+ error ( p . valueDeclaration , Diagnostics . Object_literal_s_property_0_implicitly_has_an_1_type , p . name , typeToString ( widenedType ) ) ;
3173
+ }
3174
+ }
3175
+ widenedTypes . push ( widenedType ) ;
3176
+ } ) ;
3177
+ if ( propTypeWasWidened ) {
3178
+ var members : SymbolTable = { } ;
3179
+ var index = 0 ;
3180
+ forEach ( properties , p => {
3181
+ var symbol = < TransientSymbol > createSymbol ( SymbolFlags . Property | SymbolFlags . Transient , p . name ) ;
3182
+ symbol . declarations = p . declarations ;
3183
+ symbol . parent = p . parent ;
3184
+ symbol . type = widenedTypes [ index ++ ] ;
3185
+ symbol . target = p ;
3186
+ if ( p . valueDeclaration ) symbol . valueDeclaration = p . valueDeclaration ;
3187
+ members [ symbol . name ] = symbol ;
3188
+ } ) ;
3189
+ var stringIndexType = getIndexTypeOfType ( type , IndexKind . String ) ;
3190
+ var numberIndexType = getIndexTypeOfType ( type , IndexKind . Number ) ;
3191
+ if ( stringIndexType ) stringIndexType = getWidenedType ( stringIndexType ) ;
3192
+ if ( numberIndexType ) numberIndexType = getWidenedType ( numberIndexType ) ;
3193
+ type = createAnonymousType ( type . symbol , members , emptyArray , emptyArray , stringIndexType , numberIndexType ) ;
3194
+ }
3195
+ }
3196
+ return type ;
3197
+ }
3198
+
3199
+ function getWidenedTypeOfArrayLiteral ( type : Type ) : Type {
3200
+ var elementType = ( < TypeReference > type ) . typeArguments [ 0 ] ;
3201
+ var widenedType = getWidenedType ( elementType , supressNoImplicitAnyErrors ) ;
3202
+
3203
+ type = elementType !== widenedType ? createArrayType ( widenedType ) : type ;
3204
+
3205
+ return type ;
3206
+ }
3207
3207
}
3208
3208
3209
3209
function forEachMatchingParameterType ( source : Signature , target : Signature , callback : ( s : Type , t : Type ) => void ) {
0 commit comments