Skip to content

Commit 1703ae0

Browse files
committed
Renames and more cleanup
1 parent f394190 commit 1703ae0

File tree

1 file changed

+30
-33
lines changed

1 file changed

+30
-33
lines changed

src/services/codefixes/inferFromUsage.ts

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)