Skip to content

Commit f65feaf

Browse files
authored
Port code to issue JS specific error for promises (#3653)
1 parent 85f9b3c commit f65feaf

5 files changed

Lines changed: 38 additions & 1 deletion

File tree

internal/checker/checker.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9559,6 +9559,10 @@ func (c *Checker) getArgumentArityError(node *ast.Node, signatures []*Signature,
95599559
parameterRange = strconv.Itoa(minCount)
95609560
}
95619561
isVoidPromiseError := !hasRestParameter && parameterRange == "1" && len(args) == 0 && c.isPromiseResolveArityError(node)
9562+
errorNode := getErrorNodeForCallNode(node)
9563+
if isVoidPromiseError && ast.IsInJSFile(node) {
9564+
return NewDiagnosticForNode(errorNode, diagnostics.Expected_1_argument_but_got_0_new_Promise_needs_a_JSDoc_hint_to_produce_a_resolve_that_can_be_called_without_arguments)
9565+
}
95629566
var message *diagnostics.Message
95639567
switch {
95649568
case ast.IsDecorator(node):
@@ -9574,7 +9578,6 @@ func (c *Checker) getArgumentArityError(node *ast.Node, signatures []*Signature,
95749578
default:
95759579
message = diagnostics.Expected_0_arguments_but_got_1
95769580
}
9577-
errorNode := getErrorNodeForCallNode(node)
95789581
switch {
95799582
case minCount < len(args) && len(args) < maxCount:
95809583
// between min and max, but with no matching overload
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
main.js(1,26): error TS2810: Expected 1 argument, but got 0. 'new Promise()' needs a JSDoc hint to produce a 'resolve' that can be called without arguments.
2+
3+
4+
==== main.js (1 errors) ====
5+
new Promise((resolve) => resolve());
6+
~~~~~~~
7+
!!! error TS2810: Expected 1 argument, but got 0. 'new Promise()' needs a JSDoc hint to produce a 'resolve' that can be called without arguments.
8+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//// [tests/cases/compiler/jsPromiseNeedsJSDocHint.ts] ////
2+
3+
=== main.js ===
4+
new Promise((resolve) => resolve());
5+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
6+
>resolve : Symbol(resolve, Decl(main.js, 0, 13))
7+
>resolve : Symbol(resolve, Decl(main.js, 0, 13))
8+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//// [tests/cases/compiler/jsPromiseNeedsJSDocHint.ts] ////
2+
3+
=== main.js ===
4+
new Promise((resolve) => resolve());
5+
>new Promise((resolve) => resolve()) : Promise<any>
6+
>Promise : PromiseConstructor
7+
>(resolve) => resolve() : (resolve: (value: any) => void) => void
8+
>resolve : (value: any) => void
9+
>resolve() : void
10+
>resolve : (value: any) => void
11+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// @checkJs: true
2+
// @noEmit: true
3+
4+
// https://github.com/microsoft/typescript-go/issues/3641
5+
6+
// @filename: main.js
7+
new Promise((resolve) => resolve());

0 commit comments

Comments
 (0)