MCPcopy Index your code
hub / github.com/nodejs/node / inferFromObjectTypes

Function inferFromObjectTypes

test/fixtures/snapshot/typescript.js:68936–69029  ·  view source on GitHub ↗
(source, target)

Source from the content-addressed store, hash-verified

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.

Callers

nothing calls this directly

Calls 15

isArrayTypeFunction · 0.85
inferFromTypeArgumentsFunction · 0.85
getTypeArgumentsFunction · 0.85
getVariancesFunction · 0.85
isGenericMappedTypeFunction · 0.85
inferFromTypesFunction · 0.85
inferToMappedTypeFunction · 0.85
typesDefinitelyUnrelatedFunction · 0.85
isArrayOrTupleTypeFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…