@@ -743,7 +743,6 @@ namespace ts.codefix {
743
743
744
744
if ( parent . arguments ) {
745
745
for ( const argument of parent . arguments ) {
746
- // TODO: should recursively infer a usage here, right?
747
746
call . argumentTypes . push ( checker . getTypeAtLocation ( argument ) ) ;
748
747
}
749
748
}
@@ -999,57 +998,55 @@ namespace ts.codefix {
999
998
return builtinConstructors [ type . symbol . escapedName as string ] ( unifyTypes ( types ) ) ;
1000
999
}
1001
1000
1002
- // TODO: Source and target are bad names. Should be builtinType and usageType...or something
1003
- // and search is a bad name
1004
- function infer ( source : Type , target : Type , search : Type ) : readonly Type [ ] {
1005
- if ( source === search ) {
1006
- return [ target ] ;
1001
+ function infer ( genericType : Type , usageType : Type , typeParameter : Type ) : readonly Type [ ] {
1002
+ if ( genericType === typeParameter ) {
1003
+ return [ usageType ] ;
1007
1004
}
1008
- else if ( source . flags & TypeFlags . UnionOrIntersection ) {
1009
- return flatMap ( ( source as UnionOrIntersectionType ) . types , t => infer ( t , target , search ) ) ;
1005
+ else if ( genericType . flags & TypeFlags . UnionOrIntersection ) {
1006
+ return flatMap ( ( genericType as UnionOrIntersectionType ) . types , t => infer ( t , usageType , typeParameter ) ) ;
1010
1007
}
1011
- else if ( getObjectFlags ( source ) & ObjectFlags . Reference && getObjectFlags ( target ) & ObjectFlags . Reference ) {
1008
+ else if ( getObjectFlags ( genericType ) & ObjectFlags . Reference && getObjectFlags ( usageType ) & ObjectFlags . Reference ) {
1012
1009
// this is wrong because we need a reference to the targetType to, so we can check that it's also a reference
1013
- const sourceArgs = ( source as TypeReference ) . typeArguments ;
1014
- const targetArgs = ( target as TypeReference ) . typeArguments ;
1010
+ const genericArgs = ( genericType as TypeReference ) . typeArguments ;
1011
+ const usageArgs = ( usageType as TypeReference ) . typeArguments ;
1015
1012
const types = [ ] ;
1016
- if ( sourceArgs && targetArgs ) {
1017
- for ( let i = 0 ; i < sourceArgs . length ; i ++ ) {
1018
- if ( targetArgs [ i ] ) {
1019
- types . push ( ...infer ( sourceArgs [ i ] , targetArgs [ i ] , search ) ) ;
1013
+ if ( genericArgs && usageArgs ) {
1014
+ for ( let i = 0 ; i < genericArgs . length ; i ++ ) {
1015
+ if ( usageArgs [ i ] ) {
1016
+ types . push ( ...infer ( genericArgs [ i ] , usageArgs [ i ] , typeParameter ) ) ;
1020
1017
}
1021
1018
}
1022
1019
}
1023
1020
return types ;
1024
1021
}
1025
- const sourceSigs = checker . getSignaturesOfType ( source , SignatureKind . Call ) ;
1026
- const targetSigs = checker . getSignaturesOfType ( target , SignatureKind . Call ) ;
1027
- if ( sourceSigs . length === 1 && targetSigs . length === 1 ) {
1028
- return inferFromSignatures ( sourceSigs [ 0 ] , targetSigs [ 0 ] , search ) ;
1022
+ const genericSigs = checker . getSignaturesOfType ( genericType , SignatureKind . Call ) ;
1023
+ const usageSigs = checker . getSignaturesOfType ( usageType , SignatureKind . Call ) ;
1024
+ if ( genericSigs . length === 1 && usageSigs . length === 1 ) {
1025
+ return inferFromSignatures ( genericSigs [ 0 ] , usageSigs [ 0 ] , typeParameter ) ;
1029
1026
}
1030
1027
return [ ] ;
1031
1028
}
1032
1029
1033
- function inferFromSignatures ( sourceSig : Signature , targetSig : Signature , search : Type ) {
1030
+ function inferFromSignatures ( genericSig : Signature , usageSig : Signature , typeParameter : Type ) {
1034
1031
const types = [ ] ;
1035
- for ( let i = 0 ; i < sourceSig . parameters . length ; i ++ ) {
1036
- const sourceParam = sourceSig . parameters [ i ] ;
1037
- const targetParam = targetSig . parameters [ i ] ;
1038
- const isRest = sourceSig . declaration && isRestParameter ( sourceSig . declaration . parameters [ i ] ) ;
1039
- if ( ! targetParam ) {
1032
+ for ( let i = 0 ; i < genericSig . parameters . length ; i ++ ) {
1033
+ const genericParam = genericSig . parameters [ i ] ;
1034
+ const usageParam = usageSig . parameters [ i ] ;
1035
+ const isRest = genericSig . declaration && isRestParameter ( genericSig . declaration . parameters [ i ] ) ;
1036
+ if ( ! usageParam ) {
1040
1037
break ;
1041
1038
}
1042
- let sourceType = checker . getTypeOfSymbolAtLocation ( sourceParam , sourceParam . valueDeclaration ) ;
1043
- const elementType = isRest && checker . getElementTypeOfArrayType ( sourceType ) ;
1039
+ let genericParamType = checker . getTypeOfSymbolAtLocation ( genericParam , genericParam . valueDeclaration ) ;
1040
+ const elementType = isRest && checker . getElementTypeOfArrayType ( genericParamType ) ;
1044
1041
if ( elementType ) {
1045
- sourceType = elementType ;
1042
+ genericParamType = elementType ;
1046
1043
}
1047
- const targetType = ( targetParam as SymbolLinks ) . type || checker . getTypeOfSymbolAtLocation ( targetParam , targetParam . valueDeclaration ) ;
1048
- types . push ( ...infer ( sourceType , targetType , search ) ) ;
1044
+ const targetType = ( usageParam as SymbolLinks ) . type || checker . getTypeOfSymbolAtLocation ( usageParam , usageParam . valueDeclaration ) ;
1045
+ types . push ( ...infer ( genericParamType , targetType , typeParameter ) ) ;
1049
1046
}
1050
- const sourceReturn = checker . getReturnTypeOfSignature ( sourceSig ) ;
1051
- const targetReturn = checker . getReturnTypeOfSignature ( targetSig ) ;
1052
- types . push ( ...infer ( sourceReturn , targetReturn , search ) ) ;
1047
+ const genericReturn = checker . getReturnTypeOfSignature ( genericSig ) ;
1048
+ const usageReturn = checker . getReturnTypeOfSignature ( usageSig ) ;
1049
+ types . push ( ...infer ( genericReturn , usageReturn , typeParameter ) ) ;
1053
1050
return types ;
1054
1051
}
1055
1052
0 commit comments