@@ -339,7 +339,7 @@ namespace ts {
339
339
const jsObjectLiteralIndexInfo = createIndexInfo(anyType, /*isReadonly*/ false);
340
340
341
341
const globals = createSymbolTable();
342
- const deferredInferenceCache = createMap<Type | undefined>();
342
+ const reverseMappedCache = createMap<Type | undefined>();
343
343
let ambientModulesCache: Symbol[] | undefined;
344
344
/**
345
345
* List of every ambient module with a "*" wildcard.
@@ -2861,7 +2861,7 @@ namespace ts {
2861
2861
typeElements.push(<ConstructSignatureDeclaration>signatureToSignatureDeclarationHelper(signature, SyntaxKind.ConstructSignature, context));
2862
2862
}
2863
2863
if (resolvedType.stringIndexInfo) {
2864
- const indexInfo = resolvedType.objectFlags & ObjectFlags.Deferred ?
2864
+ const indexInfo = resolvedType.objectFlags & ObjectFlags.ReverseMapped ?
2865
2865
createIndexInfo(anyType, resolvedType.stringIndexInfo.isReadonly, resolvedType.stringIndexInfo.declaration) :
2866
2866
resolvedType.stringIndexInfo;
2867
2867
typeElements.push(indexInfoToIndexSignatureDeclarationHelper(indexInfo, IndexKind.String, context));
@@ -2876,7 +2876,7 @@ namespace ts {
2876
2876
}
2877
2877
2878
2878
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);
2880
2880
const saveEnclosingDeclaration = context.enclosingDeclaration;
2881
2881
context.enclosingDeclaration = undefined;
2882
2882
const propertyName = symbolToName(propertySymbol, context, SymbolFlags.Value, /*expectsIdentifier*/ true);
@@ -3685,7 +3685,7 @@ namespace ts {
3685
3685
writePunctuation(writer, SyntaxKind.SemicolonToken);
3686
3686
writer.writeLine();
3687
3687
}
3688
- const stringIndexInfo = resolved.objectFlags & ObjectFlags.Deferred && resolved.stringIndexInfo ?
3688
+ const stringIndexInfo = resolved.objectFlags & ObjectFlags.ReverseMapped && resolved.stringIndexInfo ?
3689
3689
createIndexInfo(anyType, resolved.stringIndexInfo.isReadonly, resolved.stringIndexInfo.declaration) :
3690
3690
resolved.stringIndexInfo;
3691
3691
buildIndexSignatureDisplay(stringIndexInfo, writer, IndexKind.String, enclosingDeclaration, globalFlags, symbolStack);
@@ -3699,7 +3699,7 @@ namespace ts {
3699
3699
writer.reportPrivateInBaseOfClassExpression(symbolName(p));
3700
3700
}
3701
3701
}
3702
- const t = getCheckFlags(p) & CheckFlags.Deferred ? anyType : getTypeOfSymbol(p);
3702
+ const t = getCheckFlags(p) & CheckFlags.ReverseMapped ? anyType : getTypeOfSymbol(p);
3703
3703
if (p.flags & (SymbolFlags.Function | SymbolFlags.Method) && !getPropertiesOfObjectType(t).length) {
3704
3704
const signatures = getSignaturesOfType(t, SignatureKind.Call);
3705
3705
for (const signature of signatures) {
@@ -4907,8 +4907,8 @@ namespace ts {
4907
4907
if (getCheckFlags(symbol) & CheckFlags.Instantiated) {
4908
4908
return getTypeOfInstantiatedSymbol(symbol);
4909
4909
}
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 );
4912
4912
}
4913
4913
if (symbol.flags & (SymbolFlags.Variable | SymbolFlags.Property)) {
4914
4914
return getTypeOfVariableOrParameterOrProperty(symbol);
@@ -6120,15 +6120,15 @@ namespace ts {
6120
6120
}
6121
6121
}
6122
6122
6123
- function resolveDeferredMappedTypeMembers (type: DeferredMappedType ) {
6123
+ function resolveReverseMappedTypeMembers (type: ReverseMappedType ) {
6124
6124
const indexInfo = getIndexInfoOfType(type.source, IndexKind.String);
6125
6125
const readonlyMask = type.mappedType.declaration.readonlyToken ? false : true;
6126
6126
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);
6128
6128
const members = createSymbolTable();
6129
6129
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 ;
6132
6132
inferredProp.declarations = prop.declarations;
6133
6133
inferredProp.propertyType = getTypeOfSymbol(prop);
6134
6134
inferredProp.mappedType = type.mappedType;
@@ -6276,8 +6276,8 @@ namespace ts {
6276
6276
else if ((<ObjectType>type).objectFlags & ObjectFlags.ClassOrInterface) {
6277
6277
resolveClassOrInterfaceMembers(<InterfaceType>type);
6278
6278
}
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 );
6281
6281
}
6282
6282
else if ((<ObjectType>type).objectFlags & ObjectFlags.Anonymous) {
6283
6283
resolveAnonymousTypeMembers(<AnonymousType>type);
@@ -11307,16 +11307,16 @@ namespace ts {
11307
11307
*/
11308
11308
function inferTypeForHomomorphicMappedType(source: Type, target: MappedType): Type {
11309
11309
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);
11312
11312
}
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);
11316
11316
return type;
11317
11317
}
11318
11318
11319
- function createDeferredMappedType (source: Type, target: MappedType) {
11319
+ function createReverseMappedType (source: Type, target: MappedType) {
11320
11320
const properties = getPropertiesOfType(source);
11321
11321
if (properties.length === 0 && !getIndexInfoOfType(source, IndexKind.String)) {
11322
11322
return undefined;
@@ -11328,13 +11328,17 @@ namespace ts {
11328
11328
return undefined;
11329
11329
}
11330
11330
}
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 ;
11335
11335
}
11336
11336
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 {
11338
11342
const typeParameter = <TypeParameter>getIndexedAccessType((<IndexType>getConstraintTypeFromMappedType(target)).type, getTypeParameterFromMappedType(target));
11339
11343
const templateType = getTemplateTypeFromMappedType(target);
11340
11344
const inference = createInferenceInfo(typeParameter);
0 commit comments