From 3fa0125dd658b4e326a5032d0f532f0c491dbdc1 Mon Sep 17 00:00:00 2001 From: Osa Date: Mon, 1 Nov 2021 21:49:05 -0600 Subject: [PATCH 1/3] change error message on Promise --- src/compiler/checker.ts | 2 +- src/compiler/diagnosticMessages.json | 2 +- src/services/codefixes/fixAddVoidToPromise.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4fcb0d15a5f06..8d1ecb6708c1e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -30414,7 +30414,7 @@ namespace ts { : min < max ? min + "-" + max : min; const error = hasRestParameter ? Diagnostics.Expected_at_least_0_arguments_but_got_1 - : parameterRange === 1 && args.length === 0 && isPromiseResolveArityError(node) ? Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise + : parameterRange === 1 && args.length === 0 && isPromiseResolveArityError(node) ? Diagnostics.Expected_0_arguments_but_got_1_TypeScript_may_need_a_JSDoc_hint_that_the_call_to_new_Promise_produces_a_Promise_void : Diagnostics.Expected_0_arguments_but_got_1; if (min < args.length && args.length < max) { // between min and max, but with no matching overload diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index e8a765e514cb5..c8ed0113710d8 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3309,7 +3309,7 @@ "category": "Error", "code": 2793 }, - "Expected {0} arguments, but got {1}. Did you forget to include 'void' in your type argument to 'Promise'?": { + "Expected {0} arguments, but got {1}. TypeScript may need a JSDoc hint that the call to 'new Promise()' produces a 'Promise'": { "category": "Error", "code": 2794 }, diff --git a/src/services/codefixes/fixAddVoidToPromise.ts b/src/services/codefixes/fixAddVoidToPromise.ts index 5e6add96dac81..89e37f4121fce 100644 --- a/src/services/codefixes/fixAddVoidToPromise.ts +++ b/src/services/codefixes/fixAddVoidToPromise.ts @@ -3,7 +3,7 @@ namespace ts.codefix { const fixName = "addVoidToPromise"; const fixId = "addVoidToPromise"; const errorCodes = [ - Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise.code + Diagnostics.Expected_0_arguments_but_got_1_TypeScript_may_need_a_JSDoc_hint_that_the_call_to_new_Promise_produces_a_Promise_void.code ]; registerCodeFix({ errorCodes, From 47998e5f4b9dd8eaef44aa6ec44904bf12dee233 Mon Sep 17 00:00:00 2001 From: Nicola Dardanis Date: Sun, 3 Apr 2022 12:39:35 +0200 Subject: [PATCH 2/3] fix(46570): Unhelpful Promise type argument hint in JS file --- src/compiler/checker.ts | 4 +++- src/compiler/diagnosticMessages.json | 6 +++++- src/services/codefixes/fixAddVoidToPromise.ts | 3 ++- tests/cases/fourslash/codeFixAddVoidToPromiseJS.1.ts | 2 +- tests/cases/fourslash/codeFixAddVoidToPromiseJS.2.ts | 2 +- tests/cases/fourslash/codeFixAddVoidToPromiseJS.3.ts | 2 +- tests/cases/fourslash/codeFixAddVoidToPromiseJS.4.ts | 2 +- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8d1ecb6708c1e..fda1969a4e3f9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -30414,7 +30414,9 @@ namespace ts { : min < max ? min + "-" + max : min; const error = hasRestParameter ? Diagnostics.Expected_at_least_0_arguments_but_got_1 - : parameterRange === 1 && args.length === 0 && isPromiseResolveArityError(node) ? Diagnostics.Expected_0_arguments_but_got_1_TypeScript_may_need_a_JSDoc_hint_that_the_call_to_new_Promise_produces_a_Promise_void + : parameterRange === 1 && args.length === 0 && isPromiseResolveArityError(node) ? isInJSFile(node) + ? Diagnostics.Expected_0_arguments_but_got_1_TypeScript_may_need_a_JSDoc_hint_that_the_call_to_new_Promise_produces_a_Promise_void + : Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise : Diagnostics.Expected_0_arguments_but_got_1; if (min < args.length && args.length < max) { // between min and max, but with no matching overload diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index c8ed0113710d8..737f611f15f89 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3309,7 +3309,7 @@ "category": "Error", "code": 2793 }, - "Expected {0} arguments, but got {1}. TypeScript may need a JSDoc hint that the call to 'new Promise()' produces a 'Promise'": { + "Expected {0} arguments, but got {1}. Did you forget to include 'void' in your type argument to 'Promise'?": { "category": "Error", "code": 2794 }, @@ -3369,6 +3369,10 @@ "category": "Error", "code": 2809 }, + "Expected {0} arguments, but got {1}. TypeScript may need a JSDoc hint that the call to 'new Promise()' produces a 'Promise'": { + "category": "Error", + "code": 2810 + }, "Initializer for property '{0}'": { "category": "Error", "code": 2811 diff --git a/src/services/codefixes/fixAddVoidToPromise.ts b/src/services/codefixes/fixAddVoidToPromise.ts index 89e37f4121fce..bb0fd812e3265 100644 --- a/src/services/codefixes/fixAddVoidToPromise.ts +++ b/src/services/codefixes/fixAddVoidToPromise.ts @@ -3,7 +3,8 @@ namespace ts.codefix { const fixName = "addVoidToPromise"; const fixId = "addVoidToPromise"; const errorCodes = [ - Diagnostics.Expected_0_arguments_but_got_1_TypeScript_may_need_a_JSDoc_hint_that_the_call_to_new_Promise_produces_a_Promise_void.code + Diagnostics.Expected_0_arguments_but_got_1_TypeScript_may_need_a_JSDoc_hint_that_the_call_to_new_Promise_produces_a_Promise_void.code, + Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise.code ]; registerCodeFix({ errorCodes, diff --git a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.1.ts b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.1.ts index 417506a510c17..42b4e07f4a612 100644 --- a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.1.ts +++ b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.1.ts @@ -9,7 +9,7 @@ ////const p1 = new Promise(resolve => resolve()); verify.codeFix({ - errorCode: 2794, + errorCode: 2810, description: "Add 'void' to Promise resolved without a value", index: 2, newFileContent: `const p1 = /** @type {Promise} */(new Promise(resolve => resolve()));` diff --git a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.2.ts b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.2.ts index f3bdbb635fece..d6d8a6ed9c3c6 100644 --- a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.2.ts +++ b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.2.ts @@ -9,7 +9,7 @@ ////const p2 = /** @type {Promise} */(new Promise(resolve => resolve())); verify.codeFix({ - errorCode: 2794, + errorCode: 2810, description: "Add 'void' to Promise resolved without a value", index: 2, newFileContent: `const p2 = /** @type {Promise} */(new Promise(resolve => resolve()));` diff --git a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.3.ts b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.3.ts index 92adfb610db48..59aa8f45e9b95 100644 --- a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.3.ts +++ b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.3.ts @@ -9,7 +9,7 @@ ////const p3 = /** @type {Promise} */(new Promise(resolve => resolve())); verify.codeFix({ - errorCode: 2794, + errorCode: 2810, description: "Add 'void' to Promise resolved without a value", index: 2, newFileContent: `const p3 = /** @type {Promise} */(new Promise(resolve => resolve()));` diff --git a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.4.ts b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.4.ts index 171e1135d1aec..7985d9febc885 100644 --- a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.4.ts +++ b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.4.ts @@ -9,7 +9,7 @@ ////const p4 = /** @type {Promise<{ x: number } & { y: string }>} */(new Promise(resolve => resolve())); verify.codeFix({ - errorCode: 2794, + errorCode: 2810, description: "Add 'void' to Promise resolved without a value", index: 2, newFileContent: `const p4 = /** @type {Promise<({ x: number } & { y: string }) | void>} */(new Promise(resolve => resolve()));` From 8ba5d878e8f025dd431dbcc594747ebc4dea9dd3 Mon Sep 17 00:00:00 2001 From: Nicola Dardanis Date: Wed, 27 Apr 2022 02:36:16 +0200 Subject: [PATCH 3/3] refactor: Reword void Promise message for JSDoc type hint to provide better feedback --- src/compiler/checker.ts | 14 +++++++++----- src/compiler/diagnosticMessages.json | 2 +- src/services/codefixes/fixAddVoidToPromise.ts | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index fda1969a4e3f9..1506c4809ef33 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -30413,11 +30413,15 @@ namespace ts { const parameterRange = hasRestParameter ? min : min < max ? min + "-" + max : min; - const error = hasRestParameter ? Diagnostics.Expected_at_least_0_arguments_but_got_1 - : parameterRange === 1 && args.length === 0 && isPromiseResolveArityError(node) ? isInJSFile(node) - ? Diagnostics.Expected_0_arguments_but_got_1_TypeScript_may_need_a_JSDoc_hint_that_the_call_to_new_Promise_produces_a_Promise_void - : Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise - : Diagnostics.Expected_0_arguments_but_got_1; + const isVoidPromiseError = !hasRestParameter && parameterRange === 1 && args.length === 0 && isPromiseResolveArityError(node); + if (isVoidPromiseError && isInJSFile(node)) { + return getDiagnosticForCallNode(node, Diagnostics.Expected_1_argument_but_got_0_new_Promise_needs_a_JSDoc_hint_to_produce_a_resolve_that_can_be_called_without_arguments); + } + const error = hasRestParameter + ? Diagnostics.Expected_at_least_0_arguments_but_got_1 + : isVoidPromiseError + ? Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise + : Diagnostics.Expected_0_arguments_but_got_1; if (min < args.length && args.length < max) { // between min and max, but with no matching overload return getDiagnosticForCallNode(node, Diagnostics.No_overload_expects_0_arguments_but_overloads_do_exist_that_expect_either_1_or_2_arguments, args.length, maxBelow, minAbove); diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 737f611f15f89..44fed63932db9 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3369,7 +3369,7 @@ "category": "Error", "code": 2809 }, - "Expected {0} arguments, but got {1}. TypeScript may need a JSDoc hint that the call to 'new Promise()' produces a 'Promise'": { + "Expected 1 argument, but got 0. 'new Promise()' needs a JSDoc hint to produce a 'resolve' that can be called without arguments.": { "category": "Error", "code": 2810 }, diff --git a/src/services/codefixes/fixAddVoidToPromise.ts b/src/services/codefixes/fixAddVoidToPromise.ts index bb0fd812e3265..b088f69594a3b 100644 --- a/src/services/codefixes/fixAddVoidToPromise.ts +++ b/src/services/codefixes/fixAddVoidToPromise.ts @@ -3,7 +3,7 @@ namespace ts.codefix { const fixName = "addVoidToPromise"; const fixId = "addVoidToPromise"; const errorCodes = [ - Diagnostics.Expected_0_arguments_but_got_1_TypeScript_may_need_a_JSDoc_hint_that_the_call_to_new_Promise_produces_a_Promise_void.code, + Diagnostics.Expected_1_argument_but_got_0_new_Promise_needs_a_JSDoc_hint_to_produce_a_resolve_that_can_be_called_without_arguments.code, Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise.code ]; registerCodeFix({