@@ -743,7 +743,6 @@ namespace ts.codefix {
743743
744744 if ( parent . arguments ) {
745745 for ( const argument of parent . arguments ) {
746- // TODO: should recursively infer a usage here, right?
747746 call . argumentTypes . push ( checker . getTypeAtLocation ( argument ) ) ;
748747 }
749748 }
@@ -999,57 +998,55 @@ namespace ts.codefix {
999998 return builtinConstructors [ type . symbol . escapedName as string ] ( unifyTypes ( types ) ) ;
1000999 }
10011000
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 ] ;
10071004 }
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 ) ) ;
10101007 }
1011- else if ( getObjectFlags ( source ) & ObjectFlags . Reference && getObjectFlags ( target ) & ObjectFlags . Reference ) {
1008+ else if ( getObjectFlags ( genericType ) & ObjectFlags . Reference && getObjectFlags ( usageType ) & ObjectFlags . Reference ) {
10121009 // 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 ;
10151012 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 ) ) ;
10201017 }
10211018 }
10221019 }
10231020 return types ;
10241021 }
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 ) ;
10291026 }
10301027 return [ ] ;
10311028 }
10321029
1033- function inferFromSignatures ( sourceSig : Signature , targetSig : Signature , search : Type ) {
1030+ function inferFromSignatures ( genericSig : Signature , usageSig : Signature , typeParameter : Type ) {
10341031 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 ) {
10401037 break ;
10411038 }
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 ) ;
10441041 if ( elementType ) {
1045- sourceType = elementType ;
1042+ genericParamType = elementType ;
10461043 }
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 ) ) ;
10491046 }
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 ) ) ;
10531050 return types ;
10541051 }
10551052
0 commit comments