(source, target)
| 68934 | } |
| 68935 | } |
| 68936 | function inferFromObjectTypes(source, target) { |
| 68937 | if (ts.getObjectFlags(source) & 4 /* ObjectFlags.Reference */ && ts.getObjectFlags(target) & 4 /* ObjectFlags.Reference */ && (source.target === target.target || isArrayType(source) && isArrayType(target))) { |
| 68938 | // If source and target are references to the same generic type, infer from type arguments |
| 68939 | inferFromTypeArguments(getTypeArguments(source), getTypeArguments(target), getVariances(source.target)); |
| 68940 | return; |
| 68941 | } |
| 68942 | if (isGenericMappedType(source) && isGenericMappedType(target)) { |
| 68943 | // The source and target types are generic types { [P in S]: X } and { [P in T]: Y }, so we infer |
| 68944 | // from S to T and from X to Y. |
| 68945 | inferFromTypes(getConstraintTypeFromMappedType(source), getConstraintTypeFromMappedType(target)); |
| 68946 | inferFromTypes(getTemplateTypeFromMappedType(source), getTemplateTypeFromMappedType(target)); |
| 68947 | var sourceNameType = getNameTypeFromMappedType(source); |
| 68948 | var targetNameType = getNameTypeFromMappedType(target); |
| 68949 | if (sourceNameType && targetNameType) |
| 68950 | inferFromTypes(sourceNameType, targetNameType); |
| 68951 | } |
| 68952 | if (ts.getObjectFlags(target) & 32 /* ObjectFlags.Mapped */ && !target.declaration.nameType) { |
| 68953 | var constraintType = getConstraintTypeFromMappedType(target); |
| 68954 | if (inferToMappedType(source, target, constraintType)) { |
| 68955 | return; |
| 68956 | } |
| 68957 | } |
| 68958 | // Infer from the members of source and target only if the two types are possibly related |
| 68959 | if (!typesDefinitelyUnrelated(source, target)) { |
| 68960 | if (isArrayOrTupleType(source)) { |
| 68961 | if (isTupleType(target)) { |
| 68962 | var sourceArity = getTypeReferenceArity(source); |
| 68963 | var targetArity = getTypeReferenceArity(target); |
| 68964 | var elementTypes = getTypeArguments(target); |
| 68965 | var elementFlags = target.target.elementFlags; |
| 68966 | // When source and target are tuple types with the same structure (fixed, variadic, and rest are matched |
| 68967 | // to the same kind in each position), simply infer between the element types. |
| 68968 | if (isTupleType(source) && isTupleTypeStructureMatching(source, target)) { |
| 68969 | for (var i = 0; i < targetArity; i++) { |
| 68970 | inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); |
| 68971 | } |
| 68972 | return; |
| 68973 | } |
| 68974 | var startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0; |
| 68975 | var endLength = Math.min(isTupleType(source) ? getEndElementCount(source.target, 3 /* ElementFlags.Fixed */) : 0, target.target.hasRestElement ? getEndElementCount(target.target, 3 /* ElementFlags.Fixed */) : 0); |
| 68976 | // Infer between starting fixed elements. |
| 68977 | for (var i = 0; i < startLength; i++) { |
| 68978 | inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); |
| 68979 | } |
| 68980 | if (!isTupleType(source) || sourceArity - startLength - endLength === 1 && source.target.elementFlags[startLength] & 4 /* ElementFlags.Rest */) { |
| 68981 | // Single rest element remains in source, infer from that to every element in target |
| 68982 | var restType = getTypeArguments(source)[startLength]; |
| 68983 | for (var i = startLength; i < targetArity - endLength; i++) { |
| 68984 | inferFromTypes(elementFlags[i] & 8 /* ElementFlags.Variadic */ ? createArrayType(restType) : restType, elementTypes[i]); |
| 68985 | } |
| 68986 | } |
| 68987 | else { |
| 68988 | var middleLength = targetArity - startLength - endLength; |
| 68989 | if (middleLength === 2 && elementFlags[startLength] & elementFlags[startLength + 1] & 8 /* ElementFlags.Variadic */ && isTupleType(source)) { |
| 68990 | // Middle of target is [...T, ...U] and source is tuple type |
| 68991 | var targetInfo = getInferenceInfoForType(elementTypes[startLength]); |
| 68992 | if (targetInfo && targetInfo.impliedArity !== undefined) { |
| 68993 | // Infer slices from source based on implied arity of T. |
nothing calls this directly
no test coverage detected
searching dependent graphs…