From cc9e9ecb8e032d8121b4c378106809a984fab61a Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 9 Mar 2019 18:05:44 -0800 Subject: [PATCH] Fix signature cloning to ensure target and mapper are propagated --- src/compiler/checker.ts | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ec544ea0950..2f21893f980 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6778,8 +6778,19 @@ namespace ts { } function cloneSignature(sig: Signature): Signature { - return createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, /*resolvedReturnType*/ undefined, + const result = createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, /*resolvedReturnType*/ undefined, /*resolvedTypePredicate*/ undefined, sig.minArgumentCount, sig.hasRestParameter, sig.hasLiteralTypes); + result.target = sig.target; + result.mapper = sig.mapper; + return result; + } + + function createUnionSignature(signature: Signature, unionSignatures: Signature[]) { + const result = cloneSignature(signature); + result.unionSignatures = unionSignatures; + result.target = undefined; + result.mapper = undefined; + return result; } function getExpandedParameters(sig: Signature): ReadonlyArray { @@ -6889,9 +6900,8 @@ namespace ts { const thisType = getUnionType(map(unionSignatures, sig => sig.thisParameter ? getTypeOfSymbol(sig.thisParameter) : anyType), UnionReduction.Subtype); thisParameter = createSymbolWithType(signature.thisParameter!, thisType); } - s = cloneSignature(signature); + s = createUnionSignature(signature, unionSignatures); s.thisParameter = thisParameter; - s.unionSignatures = unionSignatures; } (result || (result = [])).push(s); } @@ -8399,8 +8409,6 @@ namespace ts { if (returnSignature) { const newReturnSignature = cloneSignature(returnSignature); newReturnSignature.typeParameters = inferredTypeParameters; - newReturnSignature.target = returnSignature.target; - newReturnSignature.mapper = returnSignature.mapper; const newInstantiatedSignature = cloneSignature(instantiatedSignature); newInstantiatedSignature.resolvedReturnType = getOrCreateTypeFromSignature(newReturnSignature); return newInstantiatedSignature; @@ -18345,14 +18353,8 @@ namespace ts { } } } - // Result is union of signatures collected (return type is union of return types of this signature set) - let result: Signature | undefined; - if (signatureList) { - result = cloneSignature(signatureList[0]); - result.unionSignatures = signatureList; - } - return result; + return signatureList && createUnionSignature(signatureList[0], signatureList); } function checkSpreadExpression(node: SpreadElement, checkMode?: CheckMode): Type {