@@ -339,7 +339,7 @@ namespace ts {
339339 const jsObjectLiteralIndexInfo = createIndexInfo(anyType, /*isReadonly*/ false);
340340
341341 const globals = createSymbolTable();
342- const deferredInferenceCache = createMap<Type | undefined>();
342+ const reverseMappedCache = createMap<Type | undefined>();
343343 let ambientModulesCache: Symbol[] | undefined;
344344 /**
345345 * List of every ambient module with a "*" wildcard.
@@ -2861,7 +2861,7 @@ namespace ts {
28612861 typeElements.push(<ConstructSignatureDeclaration>signatureToSignatureDeclarationHelper(signature, SyntaxKind.ConstructSignature, context));
28622862 }
28632863 if (resolvedType.stringIndexInfo) {
2864- const indexInfo = resolvedType.objectFlags & ObjectFlags.Deferred ?
2864+ const indexInfo = resolvedType.objectFlags & ObjectFlags.ReverseMapped ?
28652865 createIndexInfo(anyType, resolvedType.stringIndexInfo.isReadonly, resolvedType.stringIndexInfo.declaration) :
28662866 resolvedType.stringIndexInfo;
28672867 typeElements.push(indexInfoToIndexSignatureDeclarationHelper(indexInfo, IndexKind.String, context));
@@ -2876,7 +2876,7 @@ namespace ts {
28762876 }
28772877
28782878 for (const propertySymbol of properties) {
2879- const propertyType = getCheckFlags(propertySymbol) & CheckFlags.Deferred ? anyType : getTypeOfSymbol(propertySymbol);
2879+ const propertyType = getCheckFlags(propertySymbol) & CheckFlags.ReverseMapped ? anyType : getTypeOfSymbol(propertySymbol);
28802880 const saveEnclosingDeclaration = context.enclosingDeclaration;
28812881 context.enclosingDeclaration = undefined;
28822882 const propertyName = symbolToName(propertySymbol, context, SymbolFlags.Value, /*expectsIdentifier*/ true);
@@ -3685,7 +3685,7 @@ namespace ts {
36853685 writePunctuation(writer, SyntaxKind.SemicolonToken);
36863686 writer.writeLine();
36873687 }
3688- const stringIndexInfo = resolved.objectFlags & ObjectFlags.Deferred && resolved.stringIndexInfo ?
3688+ const stringIndexInfo = resolved.objectFlags & ObjectFlags.ReverseMapped && resolved.stringIndexInfo ?
36893689 createIndexInfo(anyType, resolved.stringIndexInfo.isReadonly, resolved.stringIndexInfo.declaration) :
36903690 resolved.stringIndexInfo;
36913691 buildIndexSignatureDisplay(stringIndexInfo, writer, IndexKind.String, enclosingDeclaration, globalFlags, symbolStack);
@@ -3699,7 +3699,7 @@ namespace ts {
36993699 writer.reportPrivateInBaseOfClassExpression(symbolName(p));
37003700 }
37013701 }
3702- const t = getCheckFlags(p) & CheckFlags.Deferred ? anyType : getTypeOfSymbol(p);
3702+ const t = getCheckFlags(p) & CheckFlags.ReverseMapped ? anyType : getTypeOfSymbol(p);
37033703 if (p.flags & (SymbolFlags.Function | SymbolFlags.Method) && !getPropertiesOfObjectType(t).length) {
37043704 const signatures = getSignaturesOfType(t, SignatureKind.Call);
37053705 for (const signature of signatures) {
@@ -4907,8 +4907,8 @@ namespace ts {
49074907 if (getCheckFlags(symbol) & CheckFlags.Instantiated) {
49084908 return getTypeOfInstantiatedSymbol(symbol);
49094909 }
4910- if (getCheckFlags(symbol) & CheckFlags.Deferred ) {
4911- return inferDeferredMappedType(( symbol as DeferredTransientSymbol).propertyType, (symbol as DeferredTransientSymbol).mappedType );
4910+ if (getCheckFlags(symbol) & CheckFlags.ReverseMapped ) {
4911+ return getTypeOfReverseMappedSymbol( symbol as ReverseMappedSymbol );
49124912 }
49134913 if (symbol.flags & (SymbolFlags.Variable | SymbolFlags.Property)) {
49144914 return getTypeOfVariableOrParameterOrProperty(symbol);
@@ -6120,15 +6120,15 @@ namespace ts {
61206120 }
61216121 }
61226122
6123- function resolveDeferredMappedTypeMembers (type: DeferredMappedType ) {
6123+ function resolveReverseMappedTypeMembers (type: ReverseMappedType ) {
61246124 const indexInfo = getIndexInfoOfType(type.source, IndexKind.String);
61256125 const readonlyMask = type.mappedType.declaration.readonlyToken ? false : true;
61266126 const optionalMask = type.mappedType.declaration.questionToken ? 0 : SymbolFlags.Optional;
6127- const stringIndexInfo = indexInfo && createIndexInfo(inferDeferredMappedType (indexInfo.type, type.mappedType), readonlyMask && indexInfo.isReadonly);
6127+ const stringIndexInfo = indexInfo && createIndexInfo(inferReverseMappedType (indexInfo.type, type.mappedType), readonlyMask && indexInfo.isReadonly);
61286128 const members = createSymbolTable();
61296129 for (const prop of getPropertiesOfType(type.source)) {
6130- const checkFlags = CheckFlags.Deferred | (readonlyMask && isReadonlySymbol(prop) ? CheckFlags.Readonly : 0);
6131- const inferredProp = createSymbol(SymbolFlags.Property | prop.flags & optionalMask, prop.escapedName, checkFlags) as DeferredTransientSymbol ;
6130+ const checkFlags = CheckFlags.ReverseMapped | (readonlyMask && isReadonlySymbol(prop) ? CheckFlags.Readonly : 0);
6131+ const inferredProp = createSymbol(SymbolFlags.Property | prop.flags & optionalMask, prop.escapedName, checkFlags) as ReverseMappedSymbol ;
61326132 inferredProp.declarations = prop.declarations;
61336133 inferredProp.propertyType = getTypeOfSymbol(prop);
61346134 inferredProp.mappedType = type.mappedType;
@@ -6276,8 +6276,8 @@ namespace ts {
62766276 else if ((<ObjectType>type).objectFlags & ObjectFlags.ClassOrInterface) {
62776277 resolveClassOrInterfaceMembers(<InterfaceType>type);
62786278 }
6279- else if ((<DeferredMappedType >type).objectFlags & ObjectFlags.Deferred ) {
6280- resolveDeferredMappedTypeMembers (type as DeferredMappedType );
6279+ else if ((<ReverseMappedType >type).objectFlags & ObjectFlags.ReverseMapped ) {
6280+ resolveReverseMappedTypeMembers (type as ReverseMappedType );
62816281 }
62826282 else if ((<ObjectType>type).objectFlags & ObjectFlags.Anonymous) {
62836283 resolveAnonymousTypeMembers(<AnonymousType>type);
@@ -11307,16 +11307,16 @@ namespace ts {
1130711307 */
1130811308 function inferTypeForHomomorphicMappedType(source: Type, target: MappedType): Type {
1130911309 const key = source.id + "," + target.id;
11310- if (deferredInferenceCache .has(key)) {
11311- return deferredInferenceCache .get(key);
11310+ if (reverseMappedCache .has(key)) {
11311+ return reverseMappedCache .get(key);
1131211312 }
11313- deferredInferenceCache .set(key, undefined);
11314- const type = createDeferredMappedType (source, target);
11315- deferredInferenceCache .set(key, type);
11313+ reverseMappedCache .set(key, undefined);
11314+ const type = createReverseMappedType (source, target);
11315+ reverseMappedCache .set(key, type);
1131611316 return type;
1131711317 }
1131811318
11319- function createDeferredMappedType (source: Type, target: MappedType) {
11319+ function createReverseMappedType (source: Type, target: MappedType) {
1132011320 const properties = getPropertiesOfType(source);
1132111321 if (properties.length === 0 && !getIndexInfoOfType(source, IndexKind.String)) {
1132211322 return undefined;
@@ -11328,13 +11328,17 @@ namespace ts {
1132811328 return undefined;
1132911329 }
1133011330 }
11331- const deferred = createObjectType(ObjectFlags.Deferred | ObjectFlags.Anonymous, /*symbol*/ undefined) as DeferredMappedType ;
11332- deferred .source = source;
11333- deferred .mappedType = target;
11334- return deferred ;
11331+ const reversed = createObjectType(ObjectFlags.ReverseMapped | ObjectFlags.Anonymous, /*symbol*/ undefined) as ReverseMappedType ;
11332+ reversed .source = source;
11333+ reversed .mappedType = target;
11334+ return reversed ;
1133511335 }
1133611336
11337- function inferDeferredMappedType(sourceType: Type, target: MappedType): Type {
11337+ function getTypeOfReverseMappedSymbol(symbol: ReverseMappedSymbol) {
11338+ return inferReverseMappedType(symbol.propertyType, symbol.mappedType);
11339+ }
11340+
11341+ function inferReverseMappedType(sourceType: Type, target: MappedType): Type {
1133811342 const typeParameter = <TypeParameter>getIndexedAccessType((<IndexType>getConstraintTypeFromMappedType(target)).type, getTypeParameterFromMappedType(target));
1133911343 const templateType = getTemplateTypeFromMappedType(target);
1134011344 const inference = createInferenceInfo(typeParameter);
0 commit comments