From e48bcd60babd5798d981c71fddc3c3614feb749f Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 8 Mar 2018 15:41:04 -0800 Subject: [PATCH] Treat 'yield;' as 'yield undefined;' (#22297) * Treat 'yield;' as 'yield undefined;' * Use undefinedWideningType --- src/compiler/checker.ts | 6 +---- .../reference/generatorTypeCheck48.errors.txt | 18 +++++++++++---- .../reference/generatorTypeCheck48.js | 10 +++++++- .../reference/generatorTypeCheck48.symbols | 8 +++++++ .../reference/generatorTypeCheck48.types | 9 ++++++++ .../reference/yieldExpression1.errors.txt | 16 +++++++++++++ tests/baselines/reference/yieldExpression1.js | 20 ++++++++++++---- .../reference/yieldExpression1.symbols | 16 ++++++++++--- .../reference/yieldExpression1.types | 23 ++++++++++++++++--- tests/cases/compiler/yieldExpression1.ts | 14 ++++++++--- .../yieldExpressions/generatorTypeCheck48.ts | 6 ++++- 11 files changed, 121 insertions(+), 25 deletions(-) create mode 100644 tests/baselines/reference/yieldExpression1.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 49581ff837..f3f65bd7f0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -18525,9 +18525,7 @@ namespace ts { const aggregatedTypes: Type[] = []; const isAsync = (getFunctionFlags(func) & FunctionFlags.Async) !== 0; forEachYieldExpression(func.body, yieldExpression => { - if (yieldExpression.expression) { // TODO: GH#22297 - pushIfUnique(aggregatedTypes, getYieldedTypeOfYieldExpression(yieldExpression, isAsync, checkMode)); - } + pushIfUnique(aggregatedTypes, getYieldedTypeOfYieldExpression(yieldExpression, isAsync, checkMode)); }); return aggregatedTypes; } @@ -19520,8 +19518,6 @@ namespace ts { } } - if (!node.expression) return anyType; // TODO: GH#22297 - const isAsync = (functionFlags & FunctionFlags.Async) !== 0; const yieldedType = getYieldedTypeOfYieldExpression(node, isAsync); // There is no point in doing an assignability check if the function diff --git a/tests/baselines/reference/generatorTypeCheck48.errors.txt b/tests/baselines/reference/generatorTypeCheck48.errors.txt index 867a0c35f6..a3a9706175 100644 --- a/tests/baselines/reference/generatorTypeCheck48.errors.txt +++ b/tests/baselines/reference/generatorTypeCheck48.errors.txt @@ -1,9 +1,17 @@ -tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts(1,9): error TS7025: Generator implicitly has type 'IterableIterator' because it does not yield any values. Consider supplying a return type. +tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts(1,11): error TS7010: 'g', which lacks return-type annotation, implicitly has an 'any' return type. +tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts(5,11): error TS7010: 'h', which lacks return-type annotation, implicitly has an 'any' return type. -==== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts (1 errors) ==== +==== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts (2 errors) ==== function* g() { - ~ -!!! error TS7025: Generator implicitly has type 'IterableIterator' because it does not yield any values. Consider supplying a return type. + ~ +!!! error TS7010: 'g', which lacks return-type annotation, implicitly has an 'any' return type. yield; - } \ No newline at end of file + } + + function* h() { + ~ +!!! error TS7010: 'h', which lacks return-type annotation, implicitly has an 'any' return type. + yield undefined; + } + \ No newline at end of file diff --git a/tests/baselines/reference/generatorTypeCheck48.js b/tests/baselines/reference/generatorTypeCheck48.js index f4ce9fbb33..a584681b93 100644 --- a/tests/baselines/reference/generatorTypeCheck48.js +++ b/tests/baselines/reference/generatorTypeCheck48.js @@ -1,9 +1,17 @@ //// [generatorTypeCheck48.ts] function* g() { yield; -} +} + +function* h() { + yield undefined; +} + //// [generatorTypeCheck48.js] function* g() { yield; } +function* h() { + yield undefined; +} diff --git a/tests/baselines/reference/generatorTypeCheck48.symbols b/tests/baselines/reference/generatorTypeCheck48.symbols index 323f799abe..44254586ad 100644 --- a/tests/baselines/reference/generatorTypeCheck48.symbols +++ b/tests/baselines/reference/generatorTypeCheck48.symbols @@ -4,3 +4,11 @@ function* g() { yield; } + +function* h() { +>h : Symbol(h, Decl(generatorTypeCheck48.ts, 2, 1)) + + yield undefined; +>undefined : Symbol(undefined) +} + diff --git a/tests/baselines/reference/generatorTypeCheck48.types b/tests/baselines/reference/generatorTypeCheck48.types index e7c8f0ed01..f07131595c 100644 --- a/tests/baselines/reference/generatorTypeCheck48.types +++ b/tests/baselines/reference/generatorTypeCheck48.types @@ -5,3 +5,12 @@ function* g() { yield; >yield : any } + +function* h() { +>h : () => IterableIterator + + yield undefined; +>yield undefined : any +>undefined : undefined +} + diff --git a/tests/baselines/reference/yieldExpression1.errors.txt b/tests/baselines/reference/yieldExpression1.errors.txt new file mode 100644 index 0000000000..c7d7192859 --- /dev/null +++ b/tests/baselines/reference/yieldExpression1.errors.txt @@ -0,0 +1,16 @@ +tests/cases/compiler/yieldExpression1.ts(7,5): error TS2322: Type 'undefined' is not assignable to type 'number'. + + +==== tests/cases/compiler/yieldExpression1.ts (1 errors) ==== + function* a() { + yield; + yield 0; + } + + function* b(): IterableIterator { + yield; + ~~~~~ +!!! error TS2322: Type 'undefined' is not assignable to type 'number'. + yield 0; + } + \ No newline at end of file diff --git a/tests/baselines/reference/yieldExpression1.js b/tests/baselines/reference/yieldExpression1.js index e4d5748a76..67c329010e 100644 --- a/tests/baselines/reference/yieldExpression1.js +++ b/tests/baselines/reference/yieldExpression1.js @@ -1,9 +1,21 @@ //// [yieldExpression1.ts] -function* foo() { - yield -} +function* a() { + yield; + yield 0; +} + +function* b(): IterableIterator { + yield; + yield 0; +} + //// [yieldExpression1.js] -function* foo() { +function* a() { yield; + yield 0; +} +function* b() { + yield; + yield 0; } diff --git a/tests/baselines/reference/yieldExpression1.symbols b/tests/baselines/reference/yieldExpression1.symbols index 7ca4678804..fb7c2b585f 100644 --- a/tests/baselines/reference/yieldExpression1.symbols +++ b/tests/baselines/reference/yieldExpression1.symbols @@ -1,6 +1,16 @@ === tests/cases/compiler/yieldExpression1.ts === -function* foo() { ->foo : Symbol(foo, Decl(yieldExpression1.ts, 0, 0)) +function* a() { +>a : Symbol(a, Decl(yieldExpression1.ts, 0, 0)) - yield + yield; + yield 0; } + +function* b(): IterableIterator { +>b : Symbol(b, Decl(yieldExpression1.ts, 3, 1)) +>IterableIterator : Symbol(IterableIterator, Decl(lib.es2015.iterable.d.ts, --, --)) + + yield; + yield 0; +} + diff --git a/tests/baselines/reference/yieldExpression1.types b/tests/baselines/reference/yieldExpression1.types index 1ef54eb5f3..d774004637 100644 --- a/tests/baselines/reference/yieldExpression1.types +++ b/tests/baselines/reference/yieldExpression1.types @@ -1,7 +1,24 @@ === tests/cases/compiler/yieldExpression1.ts === -function* foo() { ->foo : () => IterableIterator +function* a() { +>a : () => IterableIterator<0 | undefined> - yield + yield; >yield : any + + yield 0; +>yield 0 : any +>0 : 0 } + +function* b(): IterableIterator { +>b : () => IterableIterator +>IterableIterator : IterableIterator + + yield; +>yield : any + + yield 0; +>yield 0 : any +>0 : 0 +} + diff --git a/tests/cases/compiler/yieldExpression1.ts b/tests/cases/compiler/yieldExpression1.ts index 1f2137b840..ef5b543930 100644 --- a/tests/cases/compiler/yieldExpression1.ts +++ b/tests/cases/compiler/yieldExpression1.ts @@ -1,4 +1,12 @@ // @target: es6 -function* foo() { - yield -} \ No newline at end of file +// @strictNullChecks: true + +function* a() { + yield; + yield 0; +} + +function* b(): IterableIterator { + yield; + yield 0; +} diff --git a/tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts b/tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts index 65885f28a5..11c5ecfb80 100644 --- a/tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts +++ b/tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts @@ -3,4 +3,8 @@ function* g() { yield; -} \ No newline at end of file +} + +function* h() { + yield undefined; +}