@@ -18442,7 +18442,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1844218442 target: Signature,
1844318443 ignoreReturnTypes: boolean): boolean {
1844418444 return compareSignaturesRelated(source, target, ignoreReturnTypes ? SignatureCheckMode.IgnoreReturnTypes : 0, /*reportErrors*/ false,
18445- /*errorReporter*/ undefined, /*errorReporter */ undefined, compareTypesAssignable, /*reportUnreliableMarkers*/ undefined) !== Ternary.False;
18445+ /*errorReporter*/ undefined, /*incompatibleErrorReporter*/ undefined, /*signatureKindForErrors */ undefined, compareTypesAssignable, /*reportUnreliableMarkers*/ undefined) !== Ternary.False;
1844618446 }
1844718447
1844818448 type ErrorReporter = (message: DiagnosticMessage, arg0?: string, arg1?: string) => void;
@@ -18465,6 +18465,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1846518465 reportErrors: boolean,
1846618466 errorReporter: ErrorReporter | undefined,
1846718467 incompatibleErrorReporter: ((source: Type, target: Type) => void) | undefined,
18468+ signatureKindForErrors: SignatureKind | undefined,
1846818469 compareTypes: TypeComparer,
1846918470 reportUnreliableMarkers: TypeMapper | undefined): Ternary {
1847018471 // TODO (drosen): De-duplicate code between related functions.
@@ -18481,7 +18482,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1848118482 (checkMode & SignatureCheckMode.StrictArity ? hasEffectiveRestParameter(source) || getParameterCount(source) > targetCount : getMinArgumentCount(source) > targetCount);
1848218483 if (sourceHasMoreParameters) {
1848318484 if (reportErrors) {
18484- errorReporter!(Diagnostics.Call_signature_0_expects_more_arguments_than_call_signature_1, signatureToString(source), signatureToString(target));
18485+ const diagnostic = signatureKindForErrors! === SignatureKind.Call ? Diagnostics.Call_signature_0_expects_more_arguments_than_call_signature_1 : Diagnostics.Construct_signature_0_expects_more_arguments_than_construct_signature_1;
18486+ errorReporter!(diagnostic, signatureToString(source), signatureToString(target));
1848518487 }
1848618488 return Ternary.False;
1848718489 }
@@ -18540,7 +18542,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1854018542 const callbacks = sourceSig && targetSig && !getTypePredicateOfSignature(sourceSig) && !getTypePredicateOfSignature(targetSig) &&
1854118543 (getTypeFacts(sourceType) & TypeFacts.IsUndefinedOrNull) === (getTypeFacts(targetType) & TypeFacts.IsUndefinedOrNull);
1854218544 let related = callbacks ?
18543- compareSignaturesRelated(targetSig, sourceSig, (checkMode & SignatureCheckMode.StrictArity) | (strictVariance ? SignatureCheckMode.StrictCallback : SignatureCheckMode.BivariantCallback), reportErrors, errorReporter, incompatibleErrorReporter, compareTypes, reportUnreliableMarkers) :
18545+ compareSignaturesRelated(targetSig, sourceSig, (checkMode & SignatureCheckMode.StrictArity) | (strictVariance ? SignatureCheckMode.StrictCallback : SignatureCheckMode.BivariantCallback), reportErrors, errorReporter, incompatibleErrorReporter, signatureKindForErrors, compareTypes, reportUnreliableMarkers) :
1854418546 !(checkMode & SignatureCheckMode.Callback) && !strictVariance && compareTypes(sourceType, targetType, /*reportErrors*/ false) || compareTypes(targetType, sourceType, reportErrors);
1854518547 // With strict arity, (x: number | undefined) => void is a subtype of (x?: number | undefined) => void
1854618548 if (related && checkMode & SignatureCheckMode.StrictArity && i >= getMinArgumentCount(source) && i < getMinArgumentCount(target) && compareTypes(sourceType, targetType, /*reportErrors*/ false)) {
@@ -20914,7 +20916,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2091420916 // of the much more expensive N * M comparison matrix we explore below. We erase type parameters
2091520917 // as they are known to always be the same.
2091620918 for (let i = 0; i < targetSignatures.length; i++) {
20917- const related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], /*erase*/ true, reportErrors, incompatibleReporter(sourceSignatures[i], targetSignatures[i]));
20919+ const related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], /*erase*/ true, reportErrors, incompatibleReporter(sourceSignatures[i], targetSignatures[i]), kind );
2091820920 if (!related) {
2091920921 return Ternary.False;
2092020922 }
@@ -20930,7 +20932,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2093020932 const eraseGenerics = relation === comparableRelation || !!compilerOptions.noStrictGenericChecks;
2093120933 const sourceSignature = first(sourceSignatures);
2093220934 const targetSignature = first(targetSignatures);
20933- result = signatureRelatedTo(sourceSignature, targetSignature, eraseGenerics, reportErrors, incompatibleReporter(sourceSignature, targetSignature));
20935+ result = signatureRelatedTo(sourceSignature, targetSignature, eraseGenerics, reportErrors, incompatibleReporter(sourceSignature, targetSignature), kind );
2093420936 if (!result && reportErrors && kind === SignatureKind.Construct && (sourceObjectFlags & targetObjectFlags) &&
2093520937 (targetSignature.declaration?.kind === SyntaxKind.Constructor || sourceSignature.declaration?.kind === SyntaxKind.Constructor)) {
2093620938 const constructSignatureToString = (signature: Signature) =>
@@ -20946,7 +20948,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2094620948 // Only elaborate errors from the first failure
2094720949 let shouldElaborateErrors = reportErrors;
2094820950 for (const s of sourceSignatures) {
20949- const related = signatureRelatedTo(s, t, /*erase*/ true, shouldElaborateErrors, incompatibleReporter(s, t));
20951+ const related = signatureRelatedTo(s, t, /*erase*/ true, shouldElaborateErrors, incompatibleReporter(s, t), kind );
2095020952 if (related) {
2095120953 result &= related;
2095220954 resetErrorInfo(saveErrorInfo);
@@ -20996,9 +20998,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2099620998 /**
2099720999 * See signatureAssignableTo, compareSignaturesIdentical
2099821000 */
20999- function signatureRelatedTo(source: Signature, target: Signature, erase: boolean, reportErrors: boolean, incompatibleReporter: (source: Type, target: Type) => void): Ternary {
21001+ function signatureRelatedTo(source: Signature, target: Signature, erase: boolean, reportErrors: boolean, incompatibleReporter: (source: Type, target: Type) => void, signatureKind: SignatureKind ): Ternary {
2100021002 return compareSignaturesRelated(erase ? getErasedSignature(source) : source, erase ? getErasedSignature(target) : target,
21001- relation === strictSubtypeRelation ? SignatureCheckMode.StrictArity : 0, reportErrors, reportError, incompatibleReporter, isRelatedToWorker, reportUnreliableMapper);
21003+ relation === strictSubtypeRelation ? SignatureCheckMode.StrictArity : 0, reportErrors, reportError, incompatibleReporter, signatureKind, isRelatedToWorker, reportUnreliableMapper);
2100221004 }
2100321005
2100421006 function signaturesIdenticalTo(source: Type, target: Type, kind: SignatureKind): Ternary {
0 commit comments