Skip to content

Commit 275410d

Browse files
committed
Simplify the implementation by using a Set
1 parent 4609a44 commit 275410d

File tree

1 file changed

+10
-22
lines changed

1 file changed

+10
-22
lines changed

src/compiler/checker.ts

+10-22
Original file line numberDiff line numberDiff line change
@@ -30142,7 +30142,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3014230142
const allPropertiesTable = strictNullChecks ? createSymbolTable() : undefined;
3014330143
let propertiesTable = createSymbolTable();
3014430144
let propertiesArray: Symbol[] = [];
30145-
let computedNameTypes: Type[] = [];
30145+
let indexKeyTypes = new Set<Type>();
3014630146
let spread: Type = emptyObjectType;
3014730147

3014830148
pushCachedContextualType(node);
@@ -30156,9 +30156,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3015630156
const isJSObjectLiteral = !contextualType && isInJavascript && !enumTag;
3015730157
let objectFlags: ObjectFlags = freshObjectLiteralFlag;
3015830158
let patternWithComputedProperties = false;
30159-
let hasComputedStringProperty = false;
30160-
let hasComputedNumberProperty = false;
30161-
let hasComputedSymbolProperty = false;
3016230159

3016330160
// Spreads may cause an early bail; ensure computed names are always checked (this is cached)
3016430161
// As otherwise they may not be checked until exports for the type at this position are retrieved,
@@ -30255,10 +30252,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3025530252
spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, objectFlags, inConstContext);
3025630253
propertiesArray = [];
3025730254
propertiesTable = createSymbolTable();
30258-
computedNameTypes = [];
30259-
hasComputedStringProperty = false;
30260-
hasComputedNumberProperty = false;
30261-
hasComputedSymbolProperty = false;
30255+
indexKeyTypes = new Set();
3026230256
}
3026330257
const type = getReducedType(checkExpression(memberDecl.expression, checkMode & CheckMode.Inferential));
3026430258
if (isValidSpreadType(type)) {
@@ -30290,17 +30284,17 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3029030284

3029130285
if (computedNameType && !isTypeUsableAsPropertyName(computedNameType)) {
3029230286
if (isPatternLiteralType(computedNameType)) {
30293-
computedNameTypes.push(computedNameType);
30287+
indexKeyTypes.add(computedNameType);
3029430288
}
3029530289
else if (isTypeAssignableTo(computedNameType, stringNumberSymbolType)) {
3029630290
if (isTypeAssignableTo(computedNameType, numberType)) {
30297-
hasComputedNumberProperty = true;
30291+
indexKeyTypes.add(numberType);
3029830292
}
3029930293
else if (isTypeAssignableTo(computedNameType, esSymbolType)) {
30300-
hasComputedSymbolProperty = true;
30294+
indexKeyTypes.add(esSymbolType);
3030130295
}
3030230296
else {
30303-
hasComputedStringProperty = true;
30297+
indexKeyTypes.add(stringType);
3030430298
}
3030530299
if (inDestructuringPattern) {
3030630300
patternWithComputedProperties = true;
@@ -30355,9 +30349,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3035530349
spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, objectFlags, inConstContext);
3035630350
propertiesArray = [];
3035730351
propertiesTable = createSymbolTable();
30358-
computedNameTypes = [];
30359-
hasComputedStringProperty = false;
30360-
hasComputedNumberProperty = false;
30352+
indexKeyTypes = new Set();
3036130353
}
3036230354
// remap the raw emptyObjectType fed in at the top into a fresh empty object literal type, unique to this use site
3036330355
return mapType(spread, t => t === emptyObjectType ? createObjectLiteralType() : t);
@@ -30366,14 +30358,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3036630358
return createObjectLiteralType();
3036730359

3036830360
function createObjectLiteralType() {
30369-
let indexInfos: IndexInfo[] = [];
30370-
for (const computedNameType of computedNameTypes) {
30371-
const indexInfo = getObjectLiteralIndexInfo(offset, propertiesArray, computedNameType, /*isReadonly*/ inConstContext);
30372-
indexInfos = appendIndexInfo(indexInfos, indexInfo, /*union*/ true);
30361+
const indexInfos: IndexInfo[] = [];
30362+
for (const keyType of indexKeyTypes) {
30363+
indexInfos.push(getObjectLiteralIndexInfo(offset, propertiesArray, keyType, /*isReadonly*/ inConstContext));
3037330364
}
30374-
if (hasComputedStringProperty) indexInfos.push(getObjectLiteralIndexInfo(offset, propertiesArray, stringType, /*isReadonly*/ inConstContext));
30375-
if (hasComputedNumberProperty) indexInfos.push(getObjectLiteralIndexInfo(offset, propertiesArray, numberType, /*isReadonly*/ inConstContext));
30376-
if (hasComputedSymbolProperty) indexInfos.push(getObjectLiteralIndexInfo(offset, propertiesArray, esSymbolType, /*isReadonly*/ inConstContext));
3037730365
const result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, indexInfos);
3037830366
result.objectFlags |= objectFlags | ObjectFlags.ObjectLiteral | ObjectFlags.ContainsObjectOrArrayLiteral;
3037930367
if (isJSObjectLiteral) {

0 commit comments

Comments
 (0)