From 8cdfd3f5196671eae42ba277061702b4d3622c25 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Tue, 11 Feb 2020 16:23:04 -0800 Subject: [PATCH 1/3] getCandidateForOverloadFailure:call resolveUntypedCall This re-adds the missed errors and marks as used missed nodes from the user and RWC baselines. --- src/compiler/checker.ts | 2 +- .../checkUntypedCallError.errors.txt | 18 ++++++++++ .../reference/checkUntypedCallError.js | 20 +++++++++++ .../reference/checkUntypedCallError.symbols | 23 ++++++++++++ .../reference/checkUntypedCallError.types | 36 +++++++++++++++++++ tests/cases/compiler/checkUntypedCallError.ts | 8 +++++ 6 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/checkUntypedCallError.errors.txt create mode 100644 tests/baselines/reference/checkUntypedCallError.js create mode 100644 tests/baselines/reference/checkUntypedCallError.symbols create mode 100644 tests/baselines/reference/checkUntypedCallError.types create mode 100644 tests/cases/compiler/checkUntypedCallError.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c003090aaf45d..779836ac01e26 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -24987,7 +24987,6 @@ namespace ts { } // No signature was applicable. We have already reported the errors for the invalid signature. - // If this is a type resolution session, e.g. Language Service, try to get better information than anySignature. function getCandidateForOverloadFailure( node: CallLikeExpression, candidates: Signature[], @@ -24995,6 +24994,7 @@ namespace ts { hasCandidatesOutArray: boolean, ): Signature { Debug.assert(candidates.length > 0); // Else should not have called this. + resolveUntypedCall(node); // Normally we will combine overloads. Skip this if they have type parameters since that's hard to combine. // Don't do this if there is a `candidatesOutArray`, // because then we want the chosen best candidate to be one of the overloads, not a combination. diff --git a/tests/baselines/reference/checkUntypedCallError.errors.txt b/tests/baselines/reference/checkUntypedCallError.errors.txt new file mode 100644 index 0000000000000..a42de4fc77036 --- /dev/null +++ b/tests/baselines/reference/checkUntypedCallError.errors.txt @@ -0,0 +1,18 @@ +tests/cases/compiler/checkUntypedCallError.ts(5,10): error TS2345: Argument of type '12' is not assignable to parameter of type 'string'. +tests/cases/compiler/checkUntypedCallError.ts(7,14): error TS2345: Argument of type '12' is not assignable to parameter of type 'string'. + + +==== tests/cases/compiler/checkUntypedCallError.ts (2 errors) ==== + function greeting(username: string, x: () => void) { + x(); + return `Hello, ${username}!`; + } + greeting(12, () => { // error + ~~ +!!! error TS2345: Argument of type '12' is not assignable to parameter of type 'string'. + greeting('hi', () => 12) // ok + greeting(12, () => 12) // error + ~~ +!!! error TS2345: Argument of type '12' is not assignable to parameter of type 'string'. + }); + \ No newline at end of file diff --git a/tests/baselines/reference/checkUntypedCallError.js b/tests/baselines/reference/checkUntypedCallError.js new file mode 100644 index 0000000000000..72b5fa2892b80 --- /dev/null +++ b/tests/baselines/reference/checkUntypedCallError.js @@ -0,0 +1,20 @@ +//// [checkUntypedCallError.ts] +function greeting(username: string, x: () => void) { + x(); + return `Hello, ${username}!`; +} +greeting(12, () => { // error + greeting('hi', () => 12) // ok + greeting(12, () => 12) // error +}); + + +//// [checkUntypedCallError.js] +function greeting(username, x) { + x(); + return "Hello, " + username + "!"; +} +greeting(12, function () { + greeting('hi', function () { return 12; }); // ok + greeting(12, function () { return 12; }); // error +}); diff --git a/tests/baselines/reference/checkUntypedCallError.symbols b/tests/baselines/reference/checkUntypedCallError.symbols new file mode 100644 index 0000000000000..55a9dbf785a41 --- /dev/null +++ b/tests/baselines/reference/checkUntypedCallError.symbols @@ -0,0 +1,23 @@ +=== tests/cases/compiler/checkUntypedCallError.ts === +function greeting(username: string, x: () => void) { +>greeting : Symbol(greeting, Decl(checkUntypedCallError.ts, 0, 0)) +>username : Symbol(username, Decl(checkUntypedCallError.ts, 0, 18)) +>x : Symbol(x, Decl(checkUntypedCallError.ts, 0, 35)) + + x(); +>x : Symbol(x, Decl(checkUntypedCallError.ts, 0, 35)) + + return `Hello, ${username}!`; +>username : Symbol(username, Decl(checkUntypedCallError.ts, 0, 18)) +} +greeting(12, () => { // error +>greeting : Symbol(greeting, Decl(checkUntypedCallError.ts, 0, 0)) + + greeting('hi', () => 12) // ok +>greeting : Symbol(greeting, Decl(checkUntypedCallError.ts, 0, 0)) + + greeting(12, () => 12) // error +>greeting : Symbol(greeting, Decl(checkUntypedCallError.ts, 0, 0)) + +}); + diff --git a/tests/baselines/reference/checkUntypedCallError.types b/tests/baselines/reference/checkUntypedCallError.types new file mode 100644 index 0000000000000..df0922d4d42a7 --- /dev/null +++ b/tests/baselines/reference/checkUntypedCallError.types @@ -0,0 +1,36 @@ +=== tests/cases/compiler/checkUntypedCallError.ts === +function greeting(username: string, x: () => void) { +>greeting : (username: string, x: () => void) => string +>username : string +>x : () => void + + x(); +>x() : void +>x : () => void + + return `Hello, ${username}!`; +>`Hello, ${username}!` : string +>username : string +} +greeting(12, () => { // error +>greeting(12, () => { // error greeting('hi', () => 12) // ok greeting(12, () => 12) // error}) : string +>greeting : (username: string, x: () => void) => string +>12 : 12 +>() => { // error greeting('hi', () => 12) // ok greeting(12, () => 12) // error} : () => void + + greeting('hi', () => 12) // ok +>greeting('hi', () => 12) : string +>greeting : (username: string, x: () => void) => string +>'hi' : "hi" +>() => 12 : () => number +>12 : 12 + + greeting(12, () => 12) // error +>greeting(12, () => 12) : string +>greeting : (username: string, x: () => void) => string +>12 : 12 +>() => 12 : () => number +>12 : 12 + +}); + diff --git a/tests/cases/compiler/checkUntypedCallError.ts b/tests/cases/compiler/checkUntypedCallError.ts new file mode 100644 index 0000000000000..ef088d5f3ffcc --- /dev/null +++ b/tests/cases/compiler/checkUntypedCallError.ts @@ -0,0 +1,8 @@ +function greeting(username: string, x: () => void) { + x(); + return `Hello, ${username}!`; +} +greeting(12, () => { // error + greeting('hi', () => 12) // ok + greeting(12, () => 12) // error +}); From 582f5e0bd31ff0d2b6e58a1371736f878d18a936 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Tue, 11 Feb 2020 16:28:02 -0800 Subject: [PATCH 2/3] Update baselines and remove new test It was redundant with the old tests --- .../baselines/reference/baseCheck.errors.txt | 8 ++++- .../checkUntypedCallError.errors.txt | 18 ---------- .../reference/checkUntypedCallError.js | 20 ----------- .../reference/checkUntypedCallError.symbols | 23 ------------ .../reference/checkUntypedCallError.types | 36 ------------------- .../reference/grammarAmbiguities1.errors.txt | 14 +++++++- ...plicitTypeParameterAndArgumentType.symbols | 4 --- ...ExplicitTypeParameterAndArgumentType.types | 24 ++++++------- .../noImplicitAnyLoopCrash.errors.txt | 8 ++++- ...ionInCallExpressionWithTypeArguments.types | 4 +-- .../typeInferenceConflictingCandidates.types | 6 ++-- .../undeclaredModuleError.errors.txt | 5 ++- tests/cases/compiler/checkUntypedCallError.ts | 8 ----- 13 files changed, 48 insertions(+), 130 deletions(-) delete mode 100644 tests/baselines/reference/checkUntypedCallError.errors.txt delete mode 100644 tests/baselines/reference/checkUntypedCallError.js delete mode 100644 tests/baselines/reference/checkUntypedCallError.symbols delete mode 100644 tests/baselines/reference/checkUntypedCallError.types delete mode 100644 tests/cases/compiler/checkUntypedCallError.ts diff --git a/tests/baselines/reference/baseCheck.errors.txt b/tests/baselines/reference/baseCheck.errors.txt index 634ce2b66a647..67358a1033834 100644 --- a/tests/baselines/reference/baseCheck.errors.txt +++ b/tests/baselines/reference/baseCheck.errors.txt @@ -1,13 +1,15 @@ tests/cases/compiler/baseCheck.ts(9,18): error TS2552: Cannot find name 'loc'. Did you mean 'ELoc'? tests/cases/compiler/baseCheck.ts(17,53): error TS2554: Expected 2 arguments, but got 1. +tests/cases/compiler/baseCheck.ts(17,59): error TS17009: 'super' must be called before accessing 'this' in the constructor of a derived class. tests/cases/compiler/baseCheck.ts(18,62): error TS17009: 'super' must be called before accessing 'this' in the constructor of a derived class. tests/cases/compiler/baseCheck.ts(19,59): error TS2345: Argument of type '"hello"' is not assignable to parameter of type 'number'. +tests/cases/compiler/baseCheck.ts(19,68): error TS17009: 'super' must be called before accessing 'this' in the constructor of a derived class. tests/cases/compiler/baseCheck.ts(22,9): error TS2304: Cannot find name 'x'. tests/cases/compiler/baseCheck.ts(23,7): error TS2304: Cannot find name 'x'. tests/cases/compiler/baseCheck.ts(26,9): error TS2304: Cannot find name 'x'. -==== tests/cases/compiler/baseCheck.ts (7 errors) ==== +==== tests/cases/compiler/baseCheck.ts (9 errors) ==== class C { constructor(x: number, y: number) { } } class ELoc extends C { constructor(x: number) { @@ -31,12 +33,16 @@ tests/cases/compiler/baseCheck.ts(26,9): error TS2304: Cannot find name 'x'. ~~~~~~~~~~~~~ !!! error TS2554: Expected 2 arguments, but got 1. !!! related TS6210 tests/cases/compiler/baseCheck.ts:1:34: An argument for 'y' was not provided. + ~~~~ +!!! error TS17009: 'super' must be called before accessing 'this' in the constructor of a derived class. class E extends C { constructor(public z: number) { super(0, this.z) } } ~~~~ !!! error TS17009: 'super' must be called before accessing 'this' in the constructor of a derived class. class F extends C { constructor(public z: number) { super("hello", this.z) } } // first param type ~~~~~~~ !!! error TS2345: Argument of type '"hello"' is not assignable to parameter of type 'number'. + ~~~~ +!!! error TS17009: 'super' must be called before accessing 'this' in the constructor of a derived class. function f() { if (x<10) { diff --git a/tests/baselines/reference/checkUntypedCallError.errors.txt b/tests/baselines/reference/checkUntypedCallError.errors.txt deleted file mode 100644 index a42de4fc77036..0000000000000 --- a/tests/baselines/reference/checkUntypedCallError.errors.txt +++ /dev/null @@ -1,18 +0,0 @@ -tests/cases/compiler/checkUntypedCallError.ts(5,10): error TS2345: Argument of type '12' is not assignable to parameter of type 'string'. -tests/cases/compiler/checkUntypedCallError.ts(7,14): error TS2345: Argument of type '12' is not assignable to parameter of type 'string'. - - -==== tests/cases/compiler/checkUntypedCallError.ts (2 errors) ==== - function greeting(username: string, x: () => void) { - x(); - return `Hello, ${username}!`; - } - greeting(12, () => { // error - ~~ -!!! error TS2345: Argument of type '12' is not assignable to parameter of type 'string'. - greeting('hi', () => 12) // ok - greeting(12, () => 12) // error - ~~ -!!! error TS2345: Argument of type '12' is not assignable to parameter of type 'string'. - }); - \ No newline at end of file diff --git a/tests/baselines/reference/checkUntypedCallError.js b/tests/baselines/reference/checkUntypedCallError.js deleted file mode 100644 index 72b5fa2892b80..0000000000000 --- a/tests/baselines/reference/checkUntypedCallError.js +++ /dev/null @@ -1,20 +0,0 @@ -//// [checkUntypedCallError.ts] -function greeting(username: string, x: () => void) { - x(); - return `Hello, ${username}!`; -} -greeting(12, () => { // error - greeting('hi', () => 12) // ok - greeting(12, () => 12) // error -}); - - -//// [checkUntypedCallError.js] -function greeting(username, x) { - x(); - return "Hello, " + username + "!"; -} -greeting(12, function () { - greeting('hi', function () { return 12; }); // ok - greeting(12, function () { return 12; }); // error -}); diff --git a/tests/baselines/reference/checkUntypedCallError.symbols b/tests/baselines/reference/checkUntypedCallError.symbols deleted file mode 100644 index 55a9dbf785a41..0000000000000 --- a/tests/baselines/reference/checkUntypedCallError.symbols +++ /dev/null @@ -1,23 +0,0 @@ -=== tests/cases/compiler/checkUntypedCallError.ts === -function greeting(username: string, x: () => void) { ->greeting : Symbol(greeting, Decl(checkUntypedCallError.ts, 0, 0)) ->username : Symbol(username, Decl(checkUntypedCallError.ts, 0, 18)) ->x : Symbol(x, Decl(checkUntypedCallError.ts, 0, 35)) - - x(); ->x : Symbol(x, Decl(checkUntypedCallError.ts, 0, 35)) - - return `Hello, ${username}!`; ->username : Symbol(username, Decl(checkUntypedCallError.ts, 0, 18)) -} -greeting(12, () => { // error ->greeting : Symbol(greeting, Decl(checkUntypedCallError.ts, 0, 0)) - - greeting('hi', () => 12) // ok ->greeting : Symbol(greeting, Decl(checkUntypedCallError.ts, 0, 0)) - - greeting(12, () => 12) // error ->greeting : Symbol(greeting, Decl(checkUntypedCallError.ts, 0, 0)) - -}); - diff --git a/tests/baselines/reference/checkUntypedCallError.types b/tests/baselines/reference/checkUntypedCallError.types deleted file mode 100644 index df0922d4d42a7..0000000000000 --- a/tests/baselines/reference/checkUntypedCallError.types +++ /dev/null @@ -1,36 +0,0 @@ -=== tests/cases/compiler/checkUntypedCallError.ts === -function greeting(username: string, x: () => void) { ->greeting : (username: string, x: () => void) => string ->username : string ->x : () => void - - x(); ->x() : void ->x : () => void - - return `Hello, ${username}!`; ->`Hello, ${username}!` : string ->username : string -} -greeting(12, () => { // error ->greeting(12, () => { // error greeting('hi', () => 12) // ok greeting(12, () => 12) // error}) : string ->greeting : (username: string, x: () => void) => string ->12 : 12 ->() => { // error greeting('hi', () => 12) // ok greeting(12, () => 12) // error} : () => void - - greeting('hi', () => 12) // ok ->greeting('hi', () => 12) : string ->greeting : (username: string, x: () => void) => string ->'hi' : "hi" ->() => 12 : () => number ->12 : 12 - - greeting(12, () => 12) // error ->greeting(12, () => 12) : string ->greeting : (username: string, x: () => void) => string ->12 : 12 ->() => 12 : () => number ->12 : 12 - -}); - diff --git a/tests/baselines/reference/grammarAmbiguities1.errors.txt b/tests/baselines/reference/grammarAmbiguities1.errors.txt index bc624d7bcdf38..cb3037bd72a29 100644 --- a/tests/baselines/reference/grammarAmbiguities1.errors.txt +++ b/tests/baselines/reference/grammarAmbiguities1.errors.txt @@ -1,8 +1,12 @@ +tests/cases/compiler/grammarAmbiguities1.ts(8,3): error TS2365: Operator '<' cannot be applied to types '(x: any) => any' and 'typeof A'. +tests/cases/compiler/grammarAmbiguities1.ts(8,10): error TS2365: Operator '>' cannot be applied to types 'typeof B' and 'number'. tests/cases/compiler/grammarAmbiguities1.ts(8,10): error TS2554: Expected 1 arguments, but got 2. +tests/cases/compiler/grammarAmbiguities1.ts(9,3): error TS2365: Operator '<' cannot be applied to types '(x: any) => any' and 'typeof A'. +tests/cases/compiler/grammarAmbiguities1.ts(9,10): error TS2365: Operator '>' cannot be applied to types 'typeof B' and 'number'. tests/cases/compiler/grammarAmbiguities1.ts(9,10): error TS2554: Expected 1 arguments, but got 2. -==== tests/cases/compiler/grammarAmbiguities1.ts (2 errors) ==== +==== tests/cases/compiler/grammarAmbiguities1.ts (6 errors) ==== class A { foo() { } } class B { bar() { }} function f(x) { return x; } @@ -11,9 +15,17 @@ tests/cases/compiler/grammarAmbiguities1.ts(9,10): error TS2554: Expected 1 argu f(g(7)); f(g < A, B > 7); + ~~~~~ +!!! error TS2365: Operator '<' cannot be applied to types '(x: any) => any' and 'typeof A'. + ~~~~~ +!!! error TS2365: Operator '>' cannot be applied to types 'typeof B' and 'number'. ~~~~~ !!! error TS2554: Expected 1 arguments, but got 2. f(g < A, B > +(7)); + ~~~~~ +!!! error TS2365: Operator '<' cannot be applied to types '(x: any) => any' and 'typeof A'. + ~~~~~~~~ +!!! error TS2365: Operator '>' cannot be applied to types 'typeof B' and 'number'. ~~~~~~~~ !!! error TS2554: Expected 1 arguments, but got 2. \ No newline at end of file diff --git a/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.symbols b/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.symbols index 76e53d7485959..ff8312a0e716b 100644 --- a/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.symbols +++ b/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.symbols @@ -57,17 +57,13 @@ var r7 = map([1, ""], (x) => x.toString()); // error >r7 : Symbol(r7, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 9, 3)) >map : Symbol(map, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 0, 0)) >x : Symbol(x, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 9, 39)) ->x.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) >x : Symbol(x, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 9, 39)) ->toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) var r7b = map([1, ""], (x) => x.toString()); // error >r7b : Symbol(r7b, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 10, 3)) >map : Symbol(map, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 0, 0)) >x : Symbol(x, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 10, 32)) ->x.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) >x : Symbol(x, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 10, 32)) ->toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) var r8 = map([1, ""], (x) => x.toString()); >r8 : Symbol(r8, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 11, 3)) diff --git a/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.types b/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.types index 6adf391870603..06be2f2149686 100644 --- a/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.types +++ b/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.types @@ -77,12 +77,12 @@ var r7 = map([1, ""], (x) => x.toString()); // error >[1, ""] : (string | number)[] >1 : 1 >"" : "" ->(x) => x.toString() : (x: number) => string ->x : number ->x.toString() : string ->x.toString : (radix?: number) => string ->x : number ->toString : (radix?: number) => string +>(x) => x.toString() : (x: any) => any +>x : any +>x.toString() : any +>x.toString : any +>x : any +>toString : any var r7b = map([1, ""], (x) => x.toString()); // error >r7b : unknown[] @@ -91,12 +91,12 @@ var r7b = map([1, ""], (x) => x.toString()); // error >[1, ""] : (string | number)[] >1 : 1 >"" : "" ->(x) => x.toString() : (x: number) => string ->x : number ->x.toString() : string ->x.toString : (radix?: number) => string ->x : number ->toString : (radix?: number) => string +>(x) => x.toString() : (x: any) => any +>x : any +>x.toString() : any +>x.toString : any +>x : any +>toString : any var r8 = map([1, ""], (x) => x.toString()); >r8 : string[] diff --git a/tests/baselines/reference/noImplicitAnyLoopCrash.errors.txt b/tests/baselines/reference/noImplicitAnyLoopCrash.errors.txt index 4450b128579d1..2937f133749d7 100644 --- a/tests/baselines/reference/noImplicitAnyLoopCrash.errors.txt +++ b/tests/baselines/reference/noImplicitAnyLoopCrash.errors.txt @@ -1,12 +1,18 @@ tests/cases/compiler/noImplicitAnyLoopCrash.ts(4,16): error TS2556: Expected 0 arguments, but got 1 or more. +tests/cases/compiler/noImplicitAnyLoopCrash.ts(4,19): error TS2461: Type 'number' is not an array type. +tests/cases/compiler/noImplicitAnyLoopCrash.ts(4,19): error TS2461: Type 'undefined' is not an array type. -==== tests/cases/compiler/noImplicitAnyLoopCrash.ts (1 errors) ==== +==== tests/cases/compiler/noImplicitAnyLoopCrash.ts (3 errors) ==== let foo = () => {}; let bar; while (1) { bar = ~foo(...bar); ~~~~~~ !!! error TS2556: Expected 0 arguments, but got 1 or more. + ~~~ +!!! error TS2461: Type 'number' is not an array type. + ~~~ +!!! error TS2461: Type 'undefined' is not an array type. } \ No newline at end of file diff --git a/tests/baselines/reference/thisExpressionInCallExpressionWithTypeArguments.types b/tests/baselines/reference/thisExpressionInCallExpressionWithTypeArguments.types index 2d807f4ec7d33..4cc5cf245cc44 100644 --- a/tests/baselines/reference/thisExpressionInCallExpressionWithTypeArguments.types +++ b/tests/baselines/reference/thisExpressionInCallExpressionWithTypeArguments.types @@ -11,8 +11,8 @@ class C { >2 : 2 >3 : 3 >map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] ->(x) => { return this; } : (x: number) => this ->x : number +>(x) => { return this; } : (x: any) => this +>x : any >this : this } diff --git a/tests/baselines/reference/typeInferenceConflictingCandidates.types b/tests/baselines/reference/typeInferenceConflictingCandidates.types index 27044d6e1d8b1..feb23253effdc 100644 --- a/tests/baselines/reference/typeInferenceConflictingCandidates.types +++ b/tests/baselines/reference/typeInferenceConflictingCandidates.types @@ -11,7 +11,7 @@ g("", 3, a => a); >g : (a: T, b: T, c: (t: T) => T) => T >"" : "" >3 : 3 ->a => a : (a: "") => "" ->a : "" ->a : "" +>a => a : (a: any) => any +>a : any +>a : any diff --git a/tests/baselines/reference/undeclaredModuleError.errors.txt b/tests/baselines/reference/undeclaredModuleError.errors.txt index 4d18d7e78cd0e..4a8248bfd6c96 100644 --- a/tests/baselines/reference/undeclaredModuleError.errors.txt +++ b/tests/baselines/reference/undeclaredModuleError.errors.txt @@ -1,9 +1,10 @@ tests/cases/compiler/undeclaredModuleError.ts(1,21): error TS2307: Cannot find module 'fs'. tests/cases/compiler/undeclaredModuleError.ts(8,29): error TS2345: Argument of type '() => void' is not assignable to parameter of type '(stat: any, name: string) => boolean'. Type 'void' is not assignable to type 'boolean'. +tests/cases/compiler/undeclaredModuleError.ts(11,41): error TS2304: Cannot find name 'IDoNotExist'. -==== tests/cases/compiler/undeclaredModuleError.ts (2 errors) ==== +==== tests/cases/compiler/undeclaredModuleError.ts (3 errors) ==== import fs = require('fs'); ~~~~ !!! error TS2307: Cannot find module 'fs'. @@ -20,6 +21,8 @@ tests/cases/compiler/undeclaredModuleError.ts(8,29): error TS2345: Argument of t } , (error: Error, files: {}[]) => { files.forEach((file) => { var fullPath = join(IDoNotExist); + ~~~~~~~~~~~ +!!! error TS2304: Cannot find name 'IDoNotExist'. } ); } ); } ); diff --git a/tests/cases/compiler/checkUntypedCallError.ts b/tests/cases/compiler/checkUntypedCallError.ts deleted file mode 100644 index ef088d5f3ffcc..0000000000000 --- a/tests/cases/compiler/checkUntypedCallError.ts +++ /dev/null @@ -1,8 +0,0 @@ -function greeting(username: string, x: () => void) { - x(); - return `Hello, ${username}!`; -} -greeting(12, () => { // error - greeting('hi', () => 12) // ok - greeting(12, () => 12) // error -}); From 83ef5c39d6683ffc608d71979f5b309ea10262ca Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Tue, 11 Feb 2020 17:38:07 -0800 Subject: [PATCH 3/3] Defer resolveUntypedCall on resolution failure to give priority to parameter types fixed by overload signatures --- src/compiler/checker.ts | 13 +++++++++- ...plicitTypeParameterAndArgumentType.symbols | 4 ++++ ...ExplicitTypeParameterAndArgumentType.types | 24 +++++++++---------- .../noImplicitAnyLoopCrash.errors.txt | 5 +--- ...ionInCallExpressionWithTypeArguments.types | 4 ++-- .../typeInferenceConflictingCandidates.types | 6 ++--- 6 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 779836ac01e26..b597b449be1d5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -22600,6 +22600,7 @@ namespace ts { function checkJsxSelfClosingElementDeferred(node: JsxSelfClosingElement) { checkJsxOpeningLikeElementOrOpeningFragment(node); + resolveUntypedCall(node); // ensure type arguments and parameters are typechecked, even if there is an arity error } function checkJsxSelfClosingElement(node: JsxSelfClosingElement, _checkMode: CheckMode | undefined): Type { @@ -24994,7 +24995,7 @@ namespace ts { hasCandidatesOutArray: boolean, ): Signature { Debug.assert(candidates.length > 0); // Else should not have called this. - resolveUntypedCall(node); + checkNodeDeferred(node); // Normally we will combine overloads. Skip this if they have type parameters since that's hard to combine. // Don't do this if there is a `candidatesOutArray`, // because then we want the chosen best candidate to be one of the overloads, not a combination. @@ -33913,6 +33914,16 @@ namespace ts { currentNode = node; instantiationCount = 0; switch (node.kind) { + case SyntaxKind.CallExpression: + case SyntaxKind.NewExpression: + case SyntaxKind.TaggedTemplateExpression: + case SyntaxKind.Decorator: + case SyntaxKind.JsxOpeningElement: + // These node kinds are deferred checked when overload resolution fails + // To save on work, we ensure the arguments are checked just once, in + // a deferred way + resolveUntypedCall(node as CallLikeExpression); + break; case SyntaxKind.FunctionExpression: case SyntaxKind.ArrowFunction: case SyntaxKind.MethodDeclaration: diff --git a/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.symbols b/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.symbols index ff8312a0e716b..76e53d7485959 100644 --- a/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.symbols +++ b/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.symbols @@ -57,13 +57,17 @@ var r7 = map([1, ""], (x) => x.toString()); // error >r7 : Symbol(r7, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 9, 3)) >map : Symbol(map, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 0, 0)) >x : Symbol(x, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 9, 39)) +>x.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) >x : Symbol(x, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 9, 39)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) var r7b = map([1, ""], (x) => x.toString()); // error >r7b : Symbol(r7b, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 10, 3)) >map : Symbol(map, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 0, 0)) >x : Symbol(x, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 10, 32)) +>x.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) >x : Symbol(x, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 10, 32)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) var r8 = map([1, ""], (x) => x.toString()); >r8 : Symbol(r8, Decl(mismatchedExplicitTypeParameterAndArgumentType.ts, 11, 3)) diff --git a/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.types b/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.types index 06be2f2149686..6adf391870603 100644 --- a/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.types +++ b/tests/baselines/reference/mismatchedExplicitTypeParameterAndArgumentType.types @@ -77,12 +77,12 @@ var r7 = map([1, ""], (x) => x.toString()); // error >[1, ""] : (string | number)[] >1 : 1 >"" : "" ->(x) => x.toString() : (x: any) => any ->x : any ->x.toString() : any ->x.toString : any ->x : any ->toString : any +>(x) => x.toString() : (x: number) => string +>x : number +>x.toString() : string +>x.toString : (radix?: number) => string +>x : number +>toString : (radix?: number) => string var r7b = map([1, ""], (x) => x.toString()); // error >r7b : unknown[] @@ -91,12 +91,12 @@ var r7b = map([1, ""], (x) => x.toString()); // error >[1, ""] : (string | number)[] >1 : 1 >"" : "" ->(x) => x.toString() : (x: any) => any ->x : any ->x.toString() : any ->x.toString : any ->x : any ->toString : any +>(x) => x.toString() : (x: number) => string +>x : number +>x.toString() : string +>x.toString : (radix?: number) => string +>x : number +>toString : (radix?: number) => string var r8 = map([1, ""], (x) => x.toString()); >r8 : string[] diff --git a/tests/baselines/reference/noImplicitAnyLoopCrash.errors.txt b/tests/baselines/reference/noImplicitAnyLoopCrash.errors.txt index 2937f133749d7..7526354a4c5e4 100644 --- a/tests/baselines/reference/noImplicitAnyLoopCrash.errors.txt +++ b/tests/baselines/reference/noImplicitAnyLoopCrash.errors.txt @@ -1,9 +1,8 @@ tests/cases/compiler/noImplicitAnyLoopCrash.ts(4,16): error TS2556: Expected 0 arguments, but got 1 or more. tests/cases/compiler/noImplicitAnyLoopCrash.ts(4,19): error TS2461: Type 'number' is not an array type. -tests/cases/compiler/noImplicitAnyLoopCrash.ts(4,19): error TS2461: Type 'undefined' is not an array type. -==== tests/cases/compiler/noImplicitAnyLoopCrash.ts (3 errors) ==== +==== tests/cases/compiler/noImplicitAnyLoopCrash.ts (2 errors) ==== let foo = () => {}; let bar; while (1) { @@ -12,7 +11,5 @@ tests/cases/compiler/noImplicitAnyLoopCrash.ts(4,19): error TS2461: Type 'undefi !!! error TS2556: Expected 0 arguments, but got 1 or more. ~~~ !!! error TS2461: Type 'number' is not an array type. - ~~~ -!!! error TS2461: Type 'undefined' is not an array type. } \ No newline at end of file diff --git a/tests/baselines/reference/thisExpressionInCallExpressionWithTypeArguments.types b/tests/baselines/reference/thisExpressionInCallExpressionWithTypeArguments.types index 4cc5cf245cc44..2d807f4ec7d33 100644 --- a/tests/baselines/reference/thisExpressionInCallExpressionWithTypeArguments.types +++ b/tests/baselines/reference/thisExpressionInCallExpressionWithTypeArguments.types @@ -11,8 +11,8 @@ class C { >2 : 2 >3 : 3 >map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] ->(x) => { return this; } : (x: any) => this ->x : any +>(x) => { return this; } : (x: number) => this +>x : number >this : this } diff --git a/tests/baselines/reference/typeInferenceConflictingCandidates.types b/tests/baselines/reference/typeInferenceConflictingCandidates.types index feb23253effdc..27044d6e1d8b1 100644 --- a/tests/baselines/reference/typeInferenceConflictingCandidates.types +++ b/tests/baselines/reference/typeInferenceConflictingCandidates.types @@ -11,7 +11,7 @@ g("", 3, a => a); >g : (a: T, b: T, c: (t: T) => T) => T >"" : "" >3 : 3 ->a => a : (a: any) => any ->a : any ->a : any +>a => a : (a: "") => "" +>a : "" +>a : ""