Skip to content

Commit c7d3806

Browse files
committed
More optimizations
1 parent 8e6a2b1 commit c7d3806

File tree

2 files changed

+35
-29
lines changed

2 files changed

+35
-29
lines changed

src/compiler/checker.ts

+28-24
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ namespace ts {
728728
const keyofConstraintType = keyofStringsOnly ? stringType : stringNumberSymbolType;
729729
const numberOrBigIntType = getUnionType([numberType, bigintType]);
730730

731-
const identityMapper: TypeMapper = makeFunctionTypeMapper(t => t);
731+
const identityMapper: TypeMapper = makeUnaryTypeMapper(anyType, anyType);
732732
const restrictiveMapper: TypeMapper = makeFunctionTypeMapper(t => t.flags & TypeFlags.TypeParameter ? getRestrictiveTypeParameter(<TypeParameter>t) : t);
733733
const permissiveMapper: TypeMapper = makeFunctionTypeMapper(t => t.flags & TypeFlags.TypeParameter ? wildcardType : t);
734734

@@ -13542,16 +13542,16 @@ namespace ts {
1354213542
}
1354313543

1354413544
function createTypeMapper(sources: readonly TypeParameter[], targets: readonly Type[] | undefined): TypeMapper {
13545-
return sources.length === 1 ?
13546-
makeUnaryTypeMapper(sources[0], targets ? targets[0] : anyType) :
13547-
makeMultipleTypeMapper(sources, targets);
13545+
return sources.length === 1 ? makeUnaryTypeMapper(sources[0], targets ? targets[0] : anyType) :
13546+
sources.length === 2 ? makeSimpleTypeMapper(sources[0], targets ? targets[0] : anyType, sources[1], targets ? targets[1] : anyType) :
13547+
makeArrayTypeMapper(sources, targets);
1354813548
}
1354913549

1355013550
function getMappedType(type: Type, map: TypeMapper): Type {
1355113551
switch (map.kind) {
13552-
case TypeMapKind.Single:
13553-
return type === map.source ? map.target : type;
13554-
case TypeMapKind.Multiple:
13552+
case TypeMapKind.Simple:
13553+
return type === map.source1 ? map.target1 : type === map.source2 ? map.target2 : type;
13554+
case TypeMapKind.Array:
1355513555
const sources = map.sources;
1355613556
const targets = map.targets;
1355713557
for (let i = 0; i < sources.length; i++) {
@@ -13562,21 +13562,31 @@ namespace ts {
1356213562
return type;
1356313563
case TypeMapKind.Function:
1356413564
return map.func(type);
13565+
case TypeMapKind.Composite:
13566+
return instantiateType(getMappedType(type, map.mapper1), map.mapper2);
1356513567
}
1356613568
}
1356713569

1356813570
function makeUnaryTypeMapper(source: Type, target: Type): TypeMapper {
13569-
return { kind: TypeMapKind.Single, source, target };
13571+
return makeSimpleTypeMapper(source, target, anyType, anyType);
1357013572
}
1357113573

13572-
function makeMultipleTypeMapper(sources: readonly TypeParameter[], targets: readonly Type[] | undefined): TypeMapper {
13573-
return { kind: TypeMapKind.Multiple, sources, targets };
13574+
function makeSimpleTypeMapper(source1: Type, target1: Type, source2: Type, target2: Type): TypeMapper {
13575+
return { kind: TypeMapKind.Simple, source1, target1, source2, target2 };
13576+
}
13577+
13578+
function makeArrayTypeMapper(sources: readonly TypeParameter[], targets: readonly Type[] | undefined): TypeMapper {
13579+
return { kind: TypeMapKind.Array, sources, targets };
1357413580
}
1357513581

1357613582
function makeFunctionTypeMapper(func: (t: Type) => Type): TypeMapper {
1357713583
return { kind: TypeMapKind.Function, func };
1357813584
}
1357913585

13586+
function makeCompositeTypeMapper(mapper1: TypeMapper, mapper2: TypeMapper): TypeMapper {
13587+
return { kind: TypeMapKind.Composite, mapper1, mapper2 };
13588+
}
13589+
1358013590
function createTypeEraser(sources: readonly TypeParameter[]): TypeMapper {
1358113591
return createTypeMapper(sources, /*targets*/ undefined);
1358213592
}
@@ -13589,26 +13599,20 @@ namespace ts {
1358913599
return makeFunctionTypeMapper(t => findIndex(context.inferences, info => info.typeParameter === t) >= index ? unknownType : t);
1359013600
}
1359113601

13592-
function getTypeMapperSources(mapper: TypeMapper) {
13593-
return mapper.kind === TypeMapKind.Single ? [mapper.source] : mapper.kind === TypeMapKind.Multiple ? mapper.sources : emptyArray;
13594-
}
13595-
13596-
function getTypeMapperTargets(mapper: TypeMapper) {
13597-
return mapper.kind === TypeMapKind.Single ? [mapper.target] : mapper.kind === TypeMapKind.Multiple ? mapper.targets : emptyArray;
13598-
}
13599-
1360013602
function combineTypeMappers(mapper1: TypeMapper | undefined, mapper2: TypeMapper): TypeMapper;
1360113603
function combineTypeMappers(mapper1: TypeMapper, mapper2: TypeMapper | undefined): TypeMapper;
1360213604
function combineTypeMappers(mapper1: TypeMapper, mapper2: TypeMapper): TypeMapper {
13603-
if (!mapper1) return mapper2;
13604-
if (!mapper2) return mapper1;
13605-
return mapper1.kind !== TypeMapKind.Function && mapper2.kind !== TypeMapKind.Function ?
13606-
createTypeMapper(concatenate(getTypeMapperSources(mapper1), getTypeMapperSources(mapper2)),
13607-
concatenate(map(getTypeMapperTargets(mapper1), t => instantiateType(t, mapper2)), getTypeMapperTargets(mapper2))) :
13608-
makeFunctionTypeMapper(t => instantiateType(getMappedType(t, mapper1), mapper2));
13605+
return !mapper1 ? mapper2 : !mapper2 ? mapper1 : makeCompositeTypeMapper(mapper1, mapper2);
1360913606
}
1361013607

1361113608
function createReplacementMapper(source: Type, target: Type, baseMapper: TypeMapper): TypeMapper {
13609+
switch (baseMapper.kind) {
13610+
case TypeMapKind.Simple:
13611+
return makeSimpleTypeMapper(baseMapper.source1, baseMapper.source1 === source ? target : baseMapper.target1,
13612+
baseMapper.source2, baseMapper.source2 === source ? target : baseMapper.target2);
13613+
case TypeMapKind.Array:
13614+
return makeArrayTypeMapper(baseMapper.sources, map(baseMapper.targets, (t, i) => baseMapper.sources[i] === source ? target : t));
13615+
}
1361213616
return makeFunctionTypeMapper(t => t === source ? target : getMappedType(t, baseMapper));
1361313617
}
1361413618

src/compiler/types.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -4876,16 +4876,18 @@ namespace ts {
48764876

48774877
/* @internal */
48784878
export const enum TypeMapKind {
4879-
Single,
4880-
Multiple,
4879+
Simple,
4880+
Array,
48814881
Function,
4882+
Composite,
48824883
}
48834884

48844885
/* @internal */
48854886
export type TypeMapper =
4886-
{ kind: TypeMapKind.Single, source: Type, target: Type } |
4887-
{ kind: TypeMapKind.Multiple, sources: readonly Type[], targets: readonly Type[] | undefined } |
4888-
{ kind: TypeMapKind.Function, func: (t: Type) => Type };
4887+
| { kind: TypeMapKind.Simple, source1: Type, target1: Type, source2: Type, target2: Type }
4888+
| { kind: TypeMapKind.Array, sources: readonly Type[], targets: readonly Type[] | undefined }
4889+
| { kind: TypeMapKind.Function, func: (t: Type) => Type }
4890+
| { kind: TypeMapKind.Composite, mapper1: TypeMapper, mapper2: TypeMapper };
48894891

48904892
export const enum InferencePriority {
48914893
NakedTypeVariable = 1 << 0, // Naked type variable in union or intersection type

0 commit comments

Comments
 (0)