@@ -4744,25 +4744,25 @@ namespace ts {
4744
4744
return t => instantiateType(mapper1(t), mapper2);
4745
4745
}
4746
4746
4747
- function instantiateTypeParameter (typeParameter: TypeParameter, mapper: TypeMapper ): TypeParameter {
4747
+ function cloneTypeParameter (typeParameter: TypeParameter): TypeParameter {
4748
4748
const result = <TypeParameter>createType(TypeFlags.TypeParameter);
4749
4749
result.symbol = typeParameter.symbol;
4750
- if (typeParameter.constraint) {
4751
- result.constraint = instantiateType(typeParameter.constraint, mapper);
4752
- }
4753
- else {
4754
- result.target = typeParameter;
4755
- result.mapper = mapper;
4756
- }
4750
+ result.target = typeParameter;
4757
4751
return result;
4758
4752
}
4759
4753
4760
4754
function instantiateSignature(signature: Signature, mapper: TypeMapper, eraseTypeParameters?: boolean): Signature {
4761
4755
let freshTypeParameters: TypeParameter[];
4762
4756
let freshTypePredicate: TypePredicate;
4763
4757
if (signature.typeParameters && !eraseTypeParameters) {
4764
- freshTypeParameters = instantiateList(signature.typeParameters, mapper, instantiateTypeParameter);
4758
+ // First create a fresh set of type parameters, then include a mapping from the old to the
4759
+ // new type parameters in the mapper function. Finally store this mapper in the new type
4760
+ // parameters such that we can use it when instantiating constraints.
4761
+ freshTypeParameters = map(signature.typeParameters, cloneTypeParameter);
4765
4762
mapper = combineTypeMappers(createTypeMapper(signature.typeParameters, freshTypeParameters), mapper);
4763
+ for (const tp of freshTypeParameters) {
4764
+ tp.mapper = mapper;
4765
+ }
4766
4766
}
4767
4767
if (signature.typePredicate) {
4768
4768
freshTypePredicate = {
0 commit comments