From 35a9be3b6c703ed059d15abf5cf06583c62669d7 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 15 May 2017 16:22:04 -0700 Subject: [PATCH] Improve arity errors for all calls Not just ones with a single call signature. This is pretty great! --- src/compiler/checker.ts | 47 +++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5be1fb633cd..e7e871f12b3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15369,28 +15369,33 @@ namespace ts { reportNoCommonSupertypeError(inferenceCandidates, (node).tagName || (node).expression || (node).tag, diagnosticChainHead); } } + else if (typeArguments && every(signatures, sig => length(sig.typeParameters) !== typeArguments.length)) { + let min = Number.POSITIVE_INFINITY; + let max = Number.NEGATIVE_INFINITY; + for (const sig of signatures) { + min = Math.min(min, getMinTypeArgumentCount(sig.typeParameters)); + max = Math.max(max, length(sig.typeParameters)); + } + const paramMessage = max > min ? `${min}-${max}` : min.toString(); + reportError(Diagnostics.Expected_0_type_arguments_but_got_1, paramMessage, typeArguments.length.toString()); + } + else if (args) { + const argMessage = getSpreadArgumentIndex(args) > -1 ? + "a minimum of " + (args.length - 1) : + args.length.toString(); + let min = Number.POSITIVE_INFINITY; + let max = Number.NEGATIVE_INFINITY; + for (const sig of signatures) { + min = Math.min(min, sig.minArgumentCount); + max = Math.max(max, sig.parameters.length); + } + const paramMessage = some(signatures, sig => sig.hasRestParameter) ? "at least " + min : + min < max ? `${min}-${max}` : + min.toString(); + reportError(Diagnostics.Expected_0_arguments_but_got_1, paramMessage, argMessage); + } else { - if (signatures.length === 1) { - if (typeArguments && typeArguments.length !== length(signatures[0].typeParameters)) { - const minTypeArgumentCount = getMinTypeArgumentCount(signatures[0].typeParameters); - const paramMessage = length(signatures[0].typeParameters) > minTypeArgumentCount ? - `${minTypeArgumentCount}-${length(signatures[0].typeParameters)}` : - minTypeArgumentCount.toString(); - reportError(Diagnostics.Expected_0_type_arguments_but_got_1, paramMessage, typeArguments.length.toString()); - } - else { - const argMessage = getSpreadArgumentIndex(args) > -1 ? - "a minimum of " + (args.length - 1) : - args.length.toString(); - const paramMessage = signatures[0].hasRestParameter ? "at least " + signatures[0].minArgumentCount : - signatures[0].minArgumentCount < signatures[0].parameters.length ? `${signatures[0].minArgumentCount}-${signatures[0].parameters.length}` : - signatures[0].minArgumentCount.toString(); - reportError(Diagnostics.Expected_0_arguments_but_got_1, paramMessage, argMessage); - } - } - else { - reportError(Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target); - } + reportError(Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target); } // No signature was applicable. We have already reported the errors for the invalid signature.