Skip to content

Commit 925d97d

Browse files
committed
Cache source and target flags in local variables
1 parent 68036c5 commit 925d97d

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

src/compiler/checker.ts

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8429,34 +8429,36 @@ namespace ts {
84298429
}
84308430

84318431
function isSimpleTypeRelatedTo(source: Type, target: Type, relation: Map<RelationComparisonResult>, errorReporter?: ErrorReporter) {
8432-
if (target.flags & TypeFlags.Never) return false;
8433-
if (target.flags & TypeFlags.Any || source.flags & TypeFlags.Never) return true;
8434-
if (source.flags & TypeFlags.StringLike && target.flags & TypeFlags.String) return true;
8435-
if (source.flags & TypeFlags.StringLiteral && source.flags & TypeFlags.EnumLiteral &&
8436-
target.flags & TypeFlags.StringLiteral && !(target.flags & TypeFlags.EnumLiteral) &&
8432+
const s = source.flags;
8433+
const t = target.flags;
8434+
if (t & TypeFlags.Never) return false;
8435+
if (t & TypeFlags.Any || s & TypeFlags.Never) return true;
8436+
if (s & TypeFlags.StringLike && t & TypeFlags.String) return true;
8437+
if (s & TypeFlags.StringLiteral && s & TypeFlags.EnumLiteral &&
8438+
t & TypeFlags.StringLiteral && !(t & TypeFlags.EnumLiteral) &&
84378439
(<LiteralType>source).value === (<LiteralType>target).value) return true;
8438-
if (source.flags & TypeFlags.NumberLike && target.flags & TypeFlags.Number) return true;
8439-
if (source.flags & TypeFlags.NumberLiteral && source.flags & TypeFlags.EnumLiteral &&
8440-
target.flags & TypeFlags.NumberLiteral && !(target.flags & TypeFlags.EnumLiteral) &&
8440+
if (s & TypeFlags.NumberLike && t & TypeFlags.Number) return true;
8441+
if (s & TypeFlags.NumberLiteral && s & TypeFlags.EnumLiteral &&
8442+
t & TypeFlags.NumberLiteral && !(t & TypeFlags.EnumLiteral) &&
84418443
(<LiteralType>source).value === (<LiteralType>target).value) return true;
8442-
if (source.flags & TypeFlags.BooleanLike && target.flags & TypeFlags.Boolean) return true;
8443-
if (source.flags & TypeFlags.Enum && target.flags & TypeFlags.Enum && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true;
8444-
if (source.flags & TypeFlags.EnumLiteral && target.flags & TypeFlags.EnumLiteral) {
8445-
if (source.flags & TypeFlags.Union && target.flags & TypeFlags.Union && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true;
8446-
if (source.flags & TypeFlags.Literal && target.flags & TypeFlags.Literal &&
8444+
if (s & TypeFlags.BooleanLike && t & TypeFlags.Boolean) return true;
8445+
if (s & TypeFlags.Enum && t & TypeFlags.Enum && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true;
8446+
if (s & TypeFlags.EnumLiteral && t & TypeFlags.EnumLiteral) {
8447+
if (s & TypeFlags.Union && t & TypeFlags.Union && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true;
8448+
if (s & TypeFlags.Literal && t & TypeFlags.Literal &&
84478449
(<LiteralType>source).value === (<LiteralType>target).value &&
84488450
isEnumTypeRelatedTo(getParentOfSymbol(source.symbol), getParentOfSymbol(target.symbol), errorReporter)) return true;
84498451
}
8450-
if (source.flags & TypeFlags.Undefined && (!strictNullChecks || target.flags & (TypeFlags.Undefined | TypeFlags.Void))) return true;
8451-
if (source.flags & TypeFlags.Null && (!strictNullChecks || target.flags & TypeFlags.Null)) return true;
8452-
if (source.flags & TypeFlags.Object && target.flags & TypeFlags.NonPrimitive) return true;
8452+
if (s & TypeFlags.Undefined && (!strictNullChecks || t & (TypeFlags.Undefined | TypeFlags.Void))) return true;
8453+
if (s & TypeFlags.Null && (!strictNullChecks || t & TypeFlags.Null)) return true;
8454+
if (s & TypeFlags.Object && t & TypeFlags.NonPrimitive) return true;
84538455
if (relation === assignableRelation || relation === comparableRelation) {
8454-
if (source.flags & TypeFlags.Any) return true;
8456+
if (s & TypeFlags.Any) return true;
84558457
// Type number or any numeric literal type is assignable to any numeric enum type or any
84568458
// numeric enum literal type. This rule exists for backwards compatibility reasons because
84578459
// bit-flag enum types sometimes look like literal enum types with numeric literal values.
8458-
if (source.flags & (TypeFlags.Number | TypeFlags.NumberLiteral) && !(source.flags & TypeFlags.EnumLiteral) && (
8459-
target.flags & TypeFlags.Enum || target.flags & TypeFlags.NumberLiteral && target.flags & TypeFlags.EnumLiteral)) return true;
8460+
if (s & (TypeFlags.Number | TypeFlags.NumberLiteral) && !(s & TypeFlags.EnumLiteral) && (
8461+
t & TypeFlags.Enum || t & TypeFlags.NumberLiteral && t & TypeFlags.EnumLiteral)) return true;
84608462
}
84618463
return false;
84628464
}

0 commit comments

Comments
 (0)