From 0436cfca16f504feac2b13b3120d2c802a0231a4 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Wed, 26 Jun 2019 12:56:14 -0700 Subject: [PATCH] Do not report multiple diagnostics per signature. If there are multiple diagnostics per signature, choose the signature with the fewer diagnostics to report. If there are more than one with the minimum, choose the latest in the overload set. --- src/compiler/checker.ts | 18 ++++++++++++++---- src/compiler/core.ts | 1 + src/compiler/diagnosticMessages.json | 8 -------- src/compiler/utilities.ts | 2 +- .../heterogeneousArrayAndOverloads.errors.txt | 6 ------ 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a8f1c0de383..f38bcb88e1d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21632,19 +21632,29 @@ namespace ts { } } else { - const related: DiagnosticRelatedInformation[] = []; + const allDiagnostics: DiagnosticRelatedInformation[][] = []; + let max = 0; + let min = Number.MAX_VALUE; + let minIndex = 0; let i = 0; for (const c of candidatesForArgumentError) { - i++; - const chain = () => chainDiagnosticMessages(/*details*/ undefined, Diagnostics.Overload_0_of_1_2_gave_the_following_error, i, candidates.length, signatureToString(c)); + const chain = () => chainDiagnosticMessages(/*details*/ undefined, Diagnostics.Overload_0_of_1_2_gave_the_following_error, i + 1, candidates.length, signatureToString(c)); const diags = getSignatureApplicabilityError(node, args, c, assignableRelation, CheckMode.Normal, /*reportErrors*/ true, chain); if (diags) { - related.push(...diags); + if (diags.length <= min) { + min = diags.length; + minIndex = i; + } + max = Math.max(max, diags.length); + allDiagnostics.push(diags); } else { Debug.fail("No error for 3 or fewer overload signatures"); } + i++; } + + const related = max > 1 ? allDiagnostics[minIndex] : flatten(allDiagnostics); diagnostics.add(createDiagnosticForNodeFromMessageChain(node, chainDiagnosticMessages(/*details*/ undefined, Diagnostics.No_overload_matches_this_call), related)); } } diff --git a/src/compiler/core.ts b/src/compiler/core.ts index f1511b79c12..896bf7d849c 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -600,6 +600,7 @@ namespace ts { * * @param array The array to flatten. */ + export function flatten(array: T[][]): T[]; export function flatten(array: ReadonlyArray | undefined>): T[]; export function flatten(array: ReadonlyArray | undefined> | undefined): T[] | undefined; export function flatten(array: ReadonlyArray | undefined> | undefined): T[] | undefined { diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 8dbc74c6b12..8d96a91bd82 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -2625,14 +2625,6 @@ "category": "Error", "code": 2755 }, - "The closest overload gave the following error.": { - "category": "Error", - "code": 2756 - }, - "The closest overload is declared here.": { - "category": "Error", - "code": 2757 - }, "The last overload gave the following error.": { "category": "Error", "code": 2758 diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index ae5b60cd864..ae230d75154 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -8092,7 +8092,7 @@ namespace ts { visitDirectory(basePath, combinePaths(currentDirectory, basePath), depth); } - return flatten(results); + return flatten(results); function visitDirectory(path: string, absolutePath: string, depth: number | undefined) { const canonicalPath = toCanonical(realpath(absolutePath)); diff --git a/tests/baselines/reference/heterogeneousArrayAndOverloads.errors.txt b/tests/baselines/reference/heterogeneousArrayAndOverloads.errors.txt index d6ced6a25a1..9750b678e7f 100644 --- a/tests/baselines/reference/heterogeneousArrayAndOverloads.errors.txt +++ b/tests/baselines/reference/heterogeneousArrayAndOverloads.errors.txt @@ -15,11 +15,5 @@ tests/cases/compiler/heterogeneousArrayAndOverloads.ts(9,9): error TS2755: No ov !!! error TS2755: No overload matches this call. !!! related TS2760 tests/cases/compiler/heterogeneousArrayAndOverloads.ts:9:26: Overload 1 of 2, '(arg1: number[]): any', gave the following error. Type 'string' is not assignable to type 'number'. -!!! related TS2760 tests/cases/compiler/heterogeneousArrayAndOverloads.ts:9:20: Overload 2 of 2, '(arg1: string[]): any', gave the following error. - Type 'number' is not assignable to type 'string'. -!!! related TS2760 tests/cases/compiler/heterogeneousArrayAndOverloads.ts:9:23: Overload 2 of 2, '(arg1: string[]): any', gave the following error. - Type 'number' is not assignable to type 'string'. -!!! related TS2760 tests/cases/compiler/heterogeneousArrayAndOverloads.ts:9:32: Overload 2 of 2, '(arg1: string[]): any', gave the following error. - Type 'number' is not assignable to type 'string'. } } \ No newline at end of file