From fbb77424ddb6b661270685357f9d460b3d217c29 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Mon, 28 Oct 2019 16:17:35 -0700 Subject: [PATCH] Fix checker handling for empty type argument lists --- src/compiler/checker.ts | 6 +++--- .../reference/emptyTypeArgumentList.errors.txt | 10 +++++++--- tests/baselines/reference/emptyTypeArgumentList.js | 9 ++++++++- .../reference/emptyTypeArgumentList.symbols | 7 +++++++ .../baselines/reference/emptyTypeArgumentList.types | 10 +++++++++- .../emptyTypeArgumentListWithNew.errors.txt | 10 +++++++--- .../reference/emptyTypeArgumentListWithNew.js | 13 ++++++++++++- .../reference/emptyTypeArgumentListWithNew.symbols | 7 +++++++ .../reference/emptyTypeArgumentListWithNew.types | 10 +++++++++- .../reference/tsxTypeArgumentResolution.errors.txt | 8 +------- tests/cases/compiler/emptyTypeArgumentList.ts | 6 +++++- .../cases/compiler/emptyTypeArgumentListWithNew.ts | 6 +++++- 12 files changed, 80 insertions(+), 22 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c8df4873377d2..145e335175474 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -23435,7 +23435,7 @@ namespace ts { // the declared number of type parameters, the call has an incorrect arity. const numTypeParameters = length(signature.typeParameters); const minTypeArgumentCount = getMinTypeArgumentCount(signature.typeParameters); - return !typeArguments || + return !some(typeArguments) || (typeArguments.length >= minTypeArgumentCount && typeArguments.length <= numTypeParameters); } @@ -24195,7 +24195,7 @@ namespace ts { if (isSingleNonGenericCandidate) { const candidate = candidates[0]; - if (typeArguments || !hasCorrectArity(node, args, candidate, signatureHelpTrailingComma)) { + if (some(typeArguments) || !hasCorrectArity(node, args, candidate, signatureHelpTrailingComma)) { return undefined; } if (getSignatureApplicabilityError(node, args, candidate, relation, CheckMode.Normal, /*reportErrors*/ false, /*containingMessageChain*/ undefined)) { @@ -24216,7 +24216,7 @@ namespace ts { if (candidate.typeParameters) { let typeArgumentTypes: Type[] | undefined; - if (typeArguments) { + if (some(typeArguments)) { typeArgumentTypes = checkTypeArguments(candidate, typeArguments, /*reportErrors*/ false); if (!typeArgumentTypes) { candidateForTypeArgumentError = candidate; diff --git a/tests/baselines/reference/emptyTypeArgumentList.errors.txt b/tests/baselines/reference/emptyTypeArgumentList.errors.txt index 395c990a3d9dd..4f970efb5f213 100644 --- a/tests/baselines/reference/emptyTypeArgumentList.errors.txt +++ b/tests/baselines/reference/emptyTypeArgumentList.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/emptyTypeArgumentList.ts(2,4): error TS1099: Type argument list cannot be empty. -tests/cases/compiler/emptyTypeArgumentList.ts(2,5): error TS2558: Expected 1 type arguments, but got 0. +tests/cases/compiler/emptyTypeArgumentList.ts(6,9): error TS1099: Type argument list cannot be empty. ==== tests/cases/compiler/emptyTypeArgumentList.ts (2 errors) ==== @@ -7,5 +7,9 @@ tests/cases/compiler/emptyTypeArgumentList.ts(2,5): error TS2558: Expected 1 typ foo<>(); ~~ !!! error TS1099: Type argument list cannot be empty. - -!!! error TS2558: Expected 1 type arguments, but got 0. \ No newline at end of file + + // https://github.com/microsoft/TypeScript/issues/33041 + function noParams() {} + noParams<>(); + ~~ +!!! error TS1099: Type argument list cannot be empty. \ No newline at end of file diff --git a/tests/baselines/reference/emptyTypeArgumentList.js b/tests/baselines/reference/emptyTypeArgumentList.js index 30093113be4b6..8662c255dc246 100644 --- a/tests/baselines/reference/emptyTypeArgumentList.js +++ b/tests/baselines/reference/emptyTypeArgumentList.js @@ -1,7 +1,14 @@ //// [emptyTypeArgumentList.ts] function foo() { } -foo<>(); +foo<>(); + +// https://github.com/microsoft/TypeScript/issues/33041 +function noParams() {} +noParams<>(); //// [emptyTypeArgumentList.js] function foo() { } foo(); +// https://github.com/microsoft/TypeScript/issues/33041 +function noParams() { } +noParams(); diff --git a/tests/baselines/reference/emptyTypeArgumentList.symbols b/tests/baselines/reference/emptyTypeArgumentList.symbols index efbe5705f4fe8..78573ea57c5d2 100644 --- a/tests/baselines/reference/emptyTypeArgumentList.symbols +++ b/tests/baselines/reference/emptyTypeArgumentList.symbols @@ -6,3 +6,10 @@ function foo() { } foo<>(); >foo : Symbol(foo, Decl(emptyTypeArgumentList.ts, 0, 0)) +// https://github.com/microsoft/TypeScript/issues/33041 +function noParams() {} +>noParams : Symbol(noParams, Decl(emptyTypeArgumentList.ts, 1, 8)) + +noParams<>(); +>noParams : Symbol(noParams, Decl(emptyTypeArgumentList.ts, 1, 8)) + diff --git a/tests/baselines/reference/emptyTypeArgumentList.types b/tests/baselines/reference/emptyTypeArgumentList.types index 94eb2d878c839..32f6f64d1dcbc 100644 --- a/tests/baselines/reference/emptyTypeArgumentList.types +++ b/tests/baselines/reference/emptyTypeArgumentList.types @@ -3,6 +3,14 @@ function foo() { } >foo : () => void foo<>(); ->foo<>() : any +>foo<>() : void >foo : () => void +// https://github.com/microsoft/TypeScript/issues/33041 +function noParams() {} +>noParams : () => void + +noParams<>(); +>noParams<>() : void +>noParams : () => void + diff --git a/tests/baselines/reference/emptyTypeArgumentListWithNew.errors.txt b/tests/baselines/reference/emptyTypeArgumentListWithNew.errors.txt index 92eb250291af0..f0e756d8d9323 100644 --- a/tests/baselines/reference/emptyTypeArgumentListWithNew.errors.txt +++ b/tests/baselines/reference/emptyTypeArgumentListWithNew.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/emptyTypeArgumentListWithNew.ts(2,8): error TS1099: Type argument list cannot be empty. -tests/cases/compiler/emptyTypeArgumentListWithNew.ts(2,9): error TS2558: Expected 1 type arguments, but got 0. +tests/cases/compiler/emptyTypeArgumentListWithNew.ts(6,13): error TS1099: Type argument list cannot be empty. ==== tests/cases/compiler/emptyTypeArgumentListWithNew.ts (2 errors) ==== @@ -7,5 +7,9 @@ tests/cases/compiler/emptyTypeArgumentListWithNew.ts(2,9): error TS2558: Expecte new foo<>(); ~~ !!! error TS1099: Type argument list cannot be empty. - -!!! error TS2558: Expected 1 type arguments, but got 0. \ No newline at end of file + + // https://github.com/microsoft/TypeScript/issues/33041 + class noParams {} + new noParams<>(); + ~~ +!!! error TS1099: Type argument list cannot be empty. \ No newline at end of file diff --git a/tests/baselines/reference/emptyTypeArgumentListWithNew.js b/tests/baselines/reference/emptyTypeArgumentListWithNew.js index c30fa31609ab2..bda839b53615c 100644 --- a/tests/baselines/reference/emptyTypeArgumentListWithNew.js +++ b/tests/baselines/reference/emptyTypeArgumentListWithNew.js @@ -1,6 +1,10 @@ //// [emptyTypeArgumentListWithNew.ts] class foo { } -new foo<>(); +new foo<>(); + +// https://github.com/microsoft/TypeScript/issues/33041 +class noParams {} +new noParams<>(); //// [emptyTypeArgumentListWithNew.js] var foo = /** @class */ (function () { @@ -9,3 +13,10 @@ var foo = /** @class */ (function () { return foo; }()); new foo(); +// https://github.com/microsoft/TypeScript/issues/33041 +var noParams = /** @class */ (function () { + function noParams() { + } + return noParams; +}()); +new noParams(); diff --git a/tests/baselines/reference/emptyTypeArgumentListWithNew.symbols b/tests/baselines/reference/emptyTypeArgumentListWithNew.symbols index 34ce38aa47816..9b2404960afc1 100644 --- a/tests/baselines/reference/emptyTypeArgumentListWithNew.symbols +++ b/tests/baselines/reference/emptyTypeArgumentListWithNew.symbols @@ -6,3 +6,10 @@ class foo { } new foo<>(); >foo : Symbol(foo, Decl(emptyTypeArgumentListWithNew.ts, 0, 0)) +// https://github.com/microsoft/TypeScript/issues/33041 +class noParams {} +>noParams : Symbol(noParams, Decl(emptyTypeArgumentListWithNew.ts, 1, 12)) + +new noParams<>(); +>noParams : Symbol(noParams, Decl(emptyTypeArgumentListWithNew.ts, 1, 12)) + diff --git a/tests/baselines/reference/emptyTypeArgumentListWithNew.types b/tests/baselines/reference/emptyTypeArgumentListWithNew.types index d89c3dd041f67..57f1947c574e7 100644 --- a/tests/baselines/reference/emptyTypeArgumentListWithNew.types +++ b/tests/baselines/reference/emptyTypeArgumentListWithNew.types @@ -3,6 +3,14 @@ class foo { } >foo : foo new foo<>(); ->new foo<>() : any +>new foo<>() : foo >foo : typeof foo +// https://github.com/microsoft/TypeScript/issues/33041 +class noParams {} +>noParams : noParams + +new noParams<>(); +>new noParams<>() : noParams +>noParams : typeof noParams + diff --git a/tests/baselines/reference/tsxTypeArgumentResolution.errors.txt b/tests/baselines/reference/tsxTypeArgumentResolution.errors.txt index 7b429f073dd37..cf6dedd16ddae 100644 --- a/tests/baselines/reference/tsxTypeArgumentResolution.errors.txt +++ b/tests/baselines/reference/tsxTypeArgumentResolution.errors.txt @@ -3,9 +3,7 @@ tests/cases/conformance/jsx/file.tsx(18,26): error TS2322: Type 'number' is not tests/cases/conformance/jsx/file.tsx(20,13): error TS2558: Expected 1 type arguments, but got 2. tests/cases/conformance/jsx/file.tsx(22,13): error TS2558: Expected 1 type arguments, but got 2. tests/cases/conformance/jsx/file.tsx(24,12): error TS1099: Type argument list cannot be empty. -tests/cases/conformance/jsx/file.tsx(24,13): error TS2558: Expected 1 type arguments, but got 0. tests/cases/conformance/jsx/file.tsx(26,12): error TS1099: Type argument list cannot be empty. -tests/cases/conformance/jsx/file.tsx(26,13): error TS2558: Expected 1 type arguments, but got 0. tests/cases/conformance/jsx/file.tsx(39,14): error TS2344: Type 'Prop' does not satisfy the constraint '{ a: string; }'. Types of property 'a' are incompatible. Type 'number' is not assignable to type 'string'. @@ -16,7 +14,7 @@ tests/cases/conformance/jsx/file.tsx(51,47): error TS2322: Type 'string' is not tests/cases/conformance/jsx/file.tsx(53,47): error TS2322: Type 'string' is not assignable to type 'number'. -==== tests/cases/conformance/jsx/file.tsx (14 errors) ==== +==== tests/cases/conformance/jsx/file.tsx (12 errors) ==== import React = require('react'); interface Prop { @@ -53,14 +51,10 @@ tests/cases/conformance/jsx/file.tsx(53,47): error TS2322: Type 'string' is not x = a={10} b="hi" />; // error ~~ !!! error TS1099: Type argument list cannot be empty. - -!!! error TS2558: Expected 1 type arguments, but got 0. x = a={10} b="hi">; // error ~~ !!! error TS1099: Type argument list cannot be empty. - -!!! error TS2558: Expected 1 type arguments, but got 0. x= /> // OK diff --git a/tests/cases/compiler/emptyTypeArgumentList.ts b/tests/cases/compiler/emptyTypeArgumentList.ts index f06bbc3afd2b6..8089b3ed2b114 100644 --- a/tests/cases/compiler/emptyTypeArgumentList.ts +++ b/tests/cases/compiler/emptyTypeArgumentList.ts @@ -1,2 +1,6 @@ function foo() { } -foo<>(); \ No newline at end of file +foo<>(); + +// https://github.com/microsoft/TypeScript/issues/33041 +function noParams() {} +noParams<>(); \ No newline at end of file diff --git a/tests/cases/compiler/emptyTypeArgumentListWithNew.ts b/tests/cases/compiler/emptyTypeArgumentListWithNew.ts index 3a4926f5a8a99..f7350ac801720 100644 --- a/tests/cases/compiler/emptyTypeArgumentListWithNew.ts +++ b/tests/cases/compiler/emptyTypeArgumentListWithNew.ts @@ -1,2 +1,6 @@ class foo { } -new foo<>(); \ No newline at end of file +new foo<>(); + +// https://github.com/microsoft/TypeScript/issues/33041 +class noParams {} +new noParams<>(); \ No newline at end of file