Skip to content

Commit 91fb1ac

Browse files
committed
Refactor get(Regular|Widened)TypeOfObjectLiteral.
Now more code is shared.
1 parent e579c09 commit 91fb1ac

1 file changed

Lines changed: 30 additions & 33 deletions

File tree

src/compiler/checker.ts

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6834,45 +6834,42 @@ namespace ts {
68346834
return symbol;
68356835
}
68366836

6837+
function updateTypeOfMembers(type: Type, update: (propertyType: Type) => Type) {
6838+
const members: SymbolTable = {};
6839+
for (const property of getPropertiesOfObjectType(type)) {
6840+
const original = getTypeOfSymbol(property);
6841+
const updated = update(original);
6842+
members[property.name] = updated === original ? property : createTransientSymbol(property, updated);
6843+
};
6844+
return members;
6845+
}
6846+
68376847
function getRegularTypeOfObjectLiteral(type: Type): Type {
6838-
if (type.flags & TypeFlags.FreshObjectLiteral) {
6839-
let regularType = (<FreshObjectLiteralType>type).regularType;
6840-
if (!regularType) {
6841-
regularType = <ResolvedType>createType((<ResolvedType>type).flags & ~TypeFlags.FreshObjectLiteral);
6842-
regularType.symbol = (<ResolvedType>type).symbol;
6843-
const members: SymbolTable = {};
6844-
const properties: Symbol[] = [];
6845-
for (let p of (<ResolvedType>type).properties) {
6846-
const propType = getTypeOfSymbol(p);
6847-
if (propType.flags & TypeFlags.FreshObjectLiteral) {
6848-
p = createTransientSymbol(p, getRegularTypeOfObjectLiteral(propType));
6849-
}
6850-
members[p.name] = p;
6851-
properties.push(p);
6852-
};
6853-
regularType.properties = properties;
6854-
regularType.members = members;
6855-
regularType.callSignatures = (<ResolvedType>type).callSignatures;
6856-
regularType.constructSignatures = (<ResolvedType>type).constructSignatures;
6857-
regularType.stringIndexInfo = (<ResolvedType>type).stringIndexInfo;
6858-
regularType.numberIndexInfo = (<ResolvedType>type).numberIndexInfo;
6859-
(<FreshObjectLiteralType>type).regularType = regularType;
6860-
}
6848+
if (!(type.flags & TypeFlags.FreshObjectLiteral)) {
6849+
return type;
6850+
}
6851+
const regularType = (<FreshObjectLiteralType>type).regularType;
6852+
if (regularType) {
68616853
return regularType;
68626854
}
6863-
return type;
6855+
6856+
const resolved = <ResolvedType>type;
6857+
const members = updateTypeOfMembers(type, prop => prop.flags & TypeFlags.FreshObjectLiteral ? getRegularTypeOfObjectLiteral(prop) : prop);
6858+
const regularNew = createAnonymousType(resolved.symbol,
6859+
members,
6860+
resolved.callSignatures,
6861+
resolved.constructSignatures,
6862+
resolved.stringIndexInfo,
6863+
resolved.numberIndexInfo);
6864+
regularNew.flags = resolved.flags & ~TypeFlags.FreshObjectLiteral;
6865+
(<FreshObjectLiteralType>type).regularType = regularNew;
6866+
return regularNew;
68646867
}
68656868

68666869
function getWidenedTypeOfObjectLiteral(type: Type): Type {
6867-
const properties = getPropertiesOfObjectType(type);
6868-
const members: SymbolTable = {};
6869-
forEach(properties, p => {
6870-
const propType = getTypeOfSymbol(p);
6871-
const widenedType = getWidenedType(propType);
6872-
if (propType !== widenedType) {
6873-
p = createTransientSymbol(p, widenedType);
6874-
}
6875-
members[p.name] = p;
6870+
const members = updateTypeOfMembers(type, prop => {
6871+
const widened = getWidenedType(prop);
6872+
return prop === widened ? prop : widened;
68766873
});
68776874
const stringIndexInfo = getIndexInfoOfType(type, IndexKind.String);
68786875
const numberIndexInfo = getIndexInfoOfType(type, IndexKind.Number);

0 commit comments

Comments
 (0)