Skip to content

Commit 6ab553c

Browse files
committed
Use Map instead of array. More refactoring/renaming.
1 parent 1e8f244 commit 6ab553c

File tree

1 file changed

+18
-22
lines changed

1 file changed

+18
-22
lines changed

src/compiler/checker.ts

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8830,8 +8830,7 @@ namespace ts {
88308830
let sourceStack: Type[];
88318831
let targetStack: Type[];
88328832
let maybeCount = 0;
8833-
let maybeReferenceKeys: string[];
8834-
let maybeReferenceCount = 0;
8833+
let maybeReferences: Map<true>;
88358834
let depth = 0;
88368835
let expandingFlags = 0;
88378836
let overflow = false;
@@ -9190,37 +9189,34 @@ namespace ts {
91909189
return result;
91919190
}
91929191

9193-
function checkTypeReferenceMaybeStack(source: Type, target: Type): Ternary {
9192+
function getTypePairKey(source: Type, target: Type) {
9193+
return relation !== identityRelation || source.id < target.id ? source.id + "," + target.id : target.id + "," + source.id;
9194+
}
9195+
9196+
function alreadyComparingTypeReferences(source: Type, target: Type) {
91949197
if (!(getObjectFlags(source) & ObjectFlags.Reference) || !(getObjectFlags(target) & ObjectFlags.Reference)) {
9195-
return Ternary.False;
9198+
return false;
91969199
}
91979200
const sourceArguments = (source as TypeReference).typeArguments;
91989201
const targetArguments = (source as TypeReference).typeArguments;
9199-
const sourceGeneric = (source as TypeReference).target;
9200-
const targetGeneric = (source as TypeReference).target;
92019202

92029203
const onlyTypeParametersAsArguments =
92039204
arrayIsEqualTo(sourceArguments, targetArguments) &&
92049205
sourceArguments && sourceArguments.length > 0 &&
92059206
every(sourceArguments, t => !!(t.flags & TypeFlags.TypeParameter));
92069207
if (!onlyTypeParametersAsArguments) {
9207-
return Ternary.False;
9208+
return false;
92089209
}
9209-
const id = (relation !== identityRelation || sourceGeneric.id < targetGeneric.id ? sourceGeneric.id + "," + targetGeneric.id : targetGeneric.id + "," + sourceGeneric.id) +
9210-
"<" + map(sourceArguments, t => { let c = getConstraintFromTypeParameter(t as TypeParameter); return c ? c.id : "" }).join(',') + ">";
9211-
if (!maybeReferenceKeys) {
9212-
maybeReferenceKeys = [];
9210+
const id = getTypePairKey(source, target) +
9211+
"<" + map(sourceArguments, t => { let c = getConstraintFromTypeParameter(t as TypeParameter); return c ? c.id : "" }).join(',');
9212+
if (!maybeReferences) {
9213+
maybeReferences = createMap<true>();
92139214
}
9214-
else {
9215-
for (let i = 0; i < maybeReferenceCount; i++) {
9216-
if (id === maybeReferenceKeys[i]) {
9217-
return Ternary.Maybe;
9218-
}
9219-
}
9215+
else if (maybeReferences.has(id)) {
9216+
return true;
92209217
}
9221-
maybeReferenceKeys[maybeReferenceCount] = id;
9222-
maybeReferenceCount++;
9223-
return Ternary.False;
9218+
maybeReferences.set(id, true);
9219+
return false;
92249220
}
92259221

92269222
// Determine if possibly recursive types are related. First, check if the result is already available in the global cache.
@@ -9233,7 +9229,7 @@ namespace ts {
92339229
return Ternary.False;
92349230
}
92359231

9236-
const id = relation !== identityRelation || source.id < target.id ? source.id + "," + target.id : target.id + "," + source.id;
9232+
const id = getTypePairKey(source, target);
92379233
const related = relation.get(id);
92389234
if (related !== undefined) {
92399235
if (reportErrors && related === RelationComparisonResult.Failed) {
@@ -9263,7 +9259,7 @@ namespace ts {
92639259
return Ternary.False;
92649260
}
92659261
}
9266-
if (checkTypeReferenceMaybeStack(source, target) === Ternary.Maybe) {
9262+
if (alreadyComparingTypeReferences(source, target)) {
92679263
return Ternary.Maybe;
92689264
}
92699265

0 commit comments

Comments
 (0)