From 2fbcd36f5fd0c648a74647b86d5c6f566c34d7a7 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 2 Mar 2018 08:51:26 -0800 Subject: [PATCH 1/2] Treat 'yield;' as 'yield undefined;' --- src/compiler/checker.ts | 112 +++++++----------- .../reference/FunctionDeclaration9_es6.types | 10 +- .../reference/YieldExpression13_es6.types | 2 +- .../reference/YieldExpression3_es6.types | 2 +- .../reference/YieldExpression4_es6.types | 2 +- ....asyncGenerators.classMethods.es2015.types | 2 +- ...ter.asyncGenerators.classMethods.es5.types | 2 +- ....asyncGenerators.classMethods.esnext.types | 2 +- ...nerators.functionDeclarations.es2015.types | 2 +- ...cGenerators.functionDeclarations.es5.types | 2 +- ...nerators.functionDeclarations.esnext.types | 2 +- ...enerators.functionExpressions.es2015.types | 4 +- ...ncGenerators.functionExpressions.es5.types | 4 +- ...enerators.functionExpressions.esnext.types | 4 +- ...nerators.objectLiteralMethods.es2015.types | 6 +- ...cGenerators.objectLiteralMethods.es5.types | 6 +- ...nerators.objectLiteralMethods.esnext.types | 6 +- .../reference/generatorES6InAMDModule.types | 2 +- .../baselines/reference/generatorES6_1.types | 2 +- .../reference/generatorTypeCheck48.errors.txt | 9 -- .../reference/generatorTypeCheck48.types | 2 +- ....asyncGenerators.classMethods.esnext.types | 4 +- ...nerators.functionDeclarations.esnext.types | 4 +- ...enerators.functionExpressions.esnext.types | 8 +- ...nerators.objectLiteralMethods.esnext.types | 12 +- .../types.asyncGenerators.esnext.1.types | 2 +- .../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 ++- 31 files changed, 166 insertions(+), 138 deletions(-) delete mode 100644 tests/baselines/reference/generatorTypeCheck48.errors.txt create mode 100644 tests/baselines/reference/yieldExpression1.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 515789a3fd767..1e72b3bd6422b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -18380,27 +18380,23 @@ namespace ts { function checkAndAggregateYieldOperandTypes(func: FunctionLikeDeclaration, checkMode: CheckMode): Type[] { const aggregatedTypes: Type[] = []; - const functionFlags = getFunctionFlags(func); + const isAsync = (getFunctionFlags(func) & FunctionFlags.Async) !== 0; forEachYieldExpression(func.body, yieldExpression => { - const expr = yieldExpression.expression; - if (expr) { - let type = checkExpressionCached(expr, checkMode); - if (yieldExpression.asteriskToken) { - // A yield* expression effectively yields everything that its operand yields - type = checkIteratedTypeOrElementType(type, yieldExpression.expression, /*allowStringInput*/ false, (functionFlags & FunctionFlags.Async) !== 0); - } - if (functionFlags & FunctionFlags.Async) { - type = checkAwaitedType(type, expr, yieldExpression.asteriskToken - ? Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member - : Diagnostics.Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); - } - pushIfUnique(aggregatedTypes, type); - } + pushIfUnique(aggregatedTypes, getYieldedTypeOfYieldExpression(yieldExpression, isAsync, checkMode)); }); - return aggregatedTypes; } + function getYieldedTypeOfYieldExpression(node: YieldExpression, isAsync: boolean, checkMode?: CheckMode): Type { + const errorNode = node.expression || node; + const expressionType = node.expression ? checkExpressionCached(node.expression, checkMode) : undefinedType; + // A yield* expression effectively yields everything that its operand yields + const yieldedType = node.asteriskToken ? checkIteratedTypeOrElementType(expressionType, errorNode, /*allowStringInput*/ false, isAsync) : expressionType; + return !isAsync ? yieldedType : getAwaitedType(yieldedType, errorNode, node.asteriskToken + ? Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member + : Diagnostics.Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); + } + function isExhaustiveSwitchStatement(node: SwitchStatement): boolean { if (!node.possiblyExhaustive) { return false; @@ -19353,62 +19349,40 @@ namespace ts { } } - if (node.expression) { - const func = getContainingFunction(node); - // If the user's code is syntactically correct, the func should always have a star. After all, - // we are in a yield context. - const functionFlags = func && getFunctionFlags(func); - if (node.asteriskToken) { - // Async generator functions prior to ESNext require the __await, __asyncDelegator, - // and __asyncValues helpers - if ((functionFlags & FunctionFlags.AsyncGenerator) === FunctionFlags.AsyncGenerator && - languageVersion < ScriptTarget.ESNext) { - checkExternalEmitHelpers(node, ExternalEmitHelpers.AsyncDelegatorIncludes); - } - - // Generator functions prior to ES2015 require the __values helper - if ((functionFlags & FunctionFlags.AsyncGenerator) === FunctionFlags.Generator && - languageVersion < ScriptTarget.ES2015 && compilerOptions.downlevelIteration) { - checkExternalEmitHelpers(node, ExternalEmitHelpers.Values); - } - } - - if (functionFlags & FunctionFlags.Generator) { - const expressionType = checkExpressionCached(node.expression); - let expressionElementType: Type; - const nodeIsYieldStar = !!node.asteriskToken; - if (nodeIsYieldStar) { - expressionElementType = checkIteratedTypeOrElementType(expressionType, node.expression, /*allowStringInput*/ false, (functionFlags & FunctionFlags.Async) !== 0); - } - - // There is no point in doing an assignability check if the function - // has no explicit return type because the return type is directly computed - // from the yield expressions. - const returnType = getEffectiveReturnTypeNode(func); - if (returnType) { - const signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(returnType), (functionFlags & FunctionFlags.Async) !== 0) || anyType; - if (nodeIsYieldStar) { - checkTypeAssignableTo( - functionFlags & FunctionFlags.Async - ? getAwaitedType(expressionElementType, node.expression, Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) - : expressionElementType, - signatureElementType, - node.expression, - /*headMessage*/ undefined); - } - else { - checkTypeAssignableTo( - functionFlags & FunctionFlags.Async - ? getAwaitedType(expressionType, node.expression, Diagnostics.Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) - : expressionType, - signatureElementType, - node.expression, - /*headMessage*/ undefined); - } - } + const func = getContainingFunction(node); + const functionFlags = func ? getFunctionFlags(func) : FunctionFlags.Normal; + + if (!(functionFlags & FunctionFlags.Generator)) { + // If the user's code is syntactically correct, the func should always have a star. After all, we are in a yield context. + return anyType; + } + + if (node.asteriskToken) { + // Async generator functions prior to ESNext require the __await, __asyncDelegator, + // and __asyncValues helpers + if ((functionFlags & FunctionFlags.AsyncGenerator) === FunctionFlags.AsyncGenerator && + languageVersion < ScriptTarget.ESNext) { + checkExternalEmitHelpers(node, ExternalEmitHelpers.AsyncDelegatorIncludes); + } + + // Generator functions prior to ES2015 require the __values helper + if ((functionFlags & FunctionFlags.AsyncGenerator) === FunctionFlags.Generator && + languageVersion < ScriptTarget.ES2015 && compilerOptions.downlevelIteration) { + checkExternalEmitHelpers(node, ExternalEmitHelpers.Values); } } + const isAsync = (functionFlags & FunctionFlags.Async) !== 0; + const yieldedType = getYieldedTypeOfYieldExpression(node, isAsync); + // There is no point in doing an assignability check if the function + // has no explicit return type because the return type is directly computed + // from the yield expressions. + const returnType = getEffectiveReturnTypeNode(func); + if (returnType) { + const signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(returnType), isAsync) || anyType; + checkTypeAssignableTo(yieldedType, signatureElementType, node.expression || node, /*headMessage*/ undefined); + } + // Both yield and yield* expressions have type 'any' return anyType; } diff --git a/tests/baselines/reference/FunctionDeclaration9_es6.types b/tests/baselines/reference/FunctionDeclaration9_es6.types index 2b915b82a67b1..ec6733b9ad08e 100644 --- a/tests/baselines/reference/FunctionDeclaration9_es6.types +++ b/tests/baselines/reference/FunctionDeclaration9_es6.types @@ -1,11 +1,11 @@ === tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration9_es6.ts === function * foo() { ->foo : () => IterableIterator +>foo : () => IterableIterator var v = { [yield]: foo } ->v : { [x: number]: () => IterableIterator; } ->{ [yield]: foo } : { [x: number]: () => IterableIterator; } ->[yield] : () => IterableIterator +>v : { [x: number]: () => IterableIterator; } +>{ [yield]: foo } : { [x: number]: () => IterableIterator; } +>[yield] : () => IterableIterator >yield : any ->foo : () => IterableIterator +>foo : () => IterableIterator } diff --git a/tests/baselines/reference/YieldExpression13_es6.types b/tests/baselines/reference/YieldExpression13_es6.types index 011ac1e09e8fe..1ad2f4817b1be 100644 --- a/tests/baselines/reference/YieldExpression13_es6.types +++ b/tests/baselines/reference/YieldExpression13_es6.types @@ -1,5 +1,5 @@ === tests/cases/conformance/es6/yieldExpressions/YieldExpression13_es6.ts === function* foo() { yield } ->foo : () => IterableIterator +>foo : () => IterableIterator >yield : any diff --git a/tests/baselines/reference/YieldExpression3_es6.types b/tests/baselines/reference/YieldExpression3_es6.types index 9e2f810d91129..18d9276100a2a 100644 --- a/tests/baselines/reference/YieldExpression3_es6.types +++ b/tests/baselines/reference/YieldExpression3_es6.types @@ -1,6 +1,6 @@ === tests/cases/conformance/es6/yieldExpressions/YieldExpression3_es6.ts === function* foo() { ->foo : () => IterableIterator +>foo : () => IterableIterator yield >yield : any diff --git a/tests/baselines/reference/YieldExpression4_es6.types b/tests/baselines/reference/YieldExpression4_es6.types index 929bef38edd1d..26737f5c5bcf8 100644 --- a/tests/baselines/reference/YieldExpression4_es6.types +++ b/tests/baselines/reference/YieldExpression4_es6.types @@ -1,6 +1,6 @@ === tests/cases/conformance/es6/yieldExpressions/YieldExpression4_es6.ts === function* foo() { ->foo : () => IterableIterator +>foo : () => IterableIterator yield; >yield : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.types b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.types index c6d6fb6758d13..d468091f1af49 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.types +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.types @@ -11,7 +11,7 @@ class C2 { >C2 : C2 async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.types b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.types index 5d636d2400c6f..21512c4b64c53 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.types +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.types @@ -11,7 +11,7 @@ class C2 { >C2 : C2 async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.esnext.types b/tests/baselines/reference/emitter.asyncGenerators.classMethods.esnext.types index f2f5f4d7503bd..920a5d69ad8b2 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.esnext.types +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.esnext.types @@ -11,7 +11,7 @@ class C2 { >C2 : C2 async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.types b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.types index 15ff1298b21ac..ec2d895ee3a8e 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.types @@ -4,7 +4,7 @@ async function * f1() { } === tests/cases/conformance/emitter/es2015/asyncGenerators/F2.ts === async function * f2() { ->f2 : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.types b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.types index 6220f5efd1eca..33ccbf70a8817 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.types @@ -4,7 +4,7 @@ async function * f1() { } === tests/cases/conformance/emitter/es5/asyncGenerators/F2.ts === async function * f2() { ->f2 : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.esnext.types b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.esnext.types index c0d8011774655..0a6ddcd527296 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.esnext.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.esnext.types @@ -4,7 +4,7 @@ async function * f1() { } === tests/cases/conformance/emitter/esnext/asyncGenerators/F2.ts === async function * f2() { ->f2 : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.types b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.types index 1db2126b7ed83..f3e44242253ba 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.types @@ -5,8 +5,8 @@ const f1 = async function * () { } === tests/cases/conformance/emitter/es2015/asyncGenerators/F2.ts === const f2 = async function * () { ->f2 : () => AsyncIterableIterator ->async function * () { const x = yield;} : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator +>async function * () { const x = yield;} : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.types b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.types index e9da600bdbf1c..35826515fa13d 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.types @@ -5,8 +5,8 @@ const f1 = async function * () { } === tests/cases/conformance/emitter/es5/asyncGenerators/F2.ts === const f2 = async function * () { ->f2 : () => AsyncIterableIterator ->async function * () { const x = yield;} : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator +>async function * () { const x = yield;} : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.esnext.types b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.esnext.types index 5802bc10a2d9e..6268996754d65 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.esnext.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.esnext.types @@ -5,8 +5,8 @@ const f1 = async function * () { } === tests/cases/conformance/emitter/esnext/asyncGenerators/F2.ts === const f2 = async function * () { ->f2 : () => AsyncIterableIterator ->async function * () { const x = yield;} : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator +>async function * () { const x = yield;} : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.types b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.types index 9e47fc9d98932..1a447be3287eb 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.types +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.types @@ -9,11 +9,11 @@ const o1 = { } === tests/cases/conformance/emitter/es2015/asyncGenerators/O2.ts === const o2 = { ->o2 : { f(): AsyncIterableIterator; } ->{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } +>o2 : { f(): AsyncIterableIterator; } +>{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.types b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.types index 390007605083d..f8e44b8b5d8b3 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.types +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.types @@ -9,11 +9,11 @@ const o1 = { } === tests/cases/conformance/emitter/es5/asyncGenerators/O2.ts === const o2 = { ->o2 : { f(): AsyncIterableIterator; } ->{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } +>o2 : { f(): AsyncIterableIterator; } +>{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.esnext.types b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.esnext.types index a05b5326b2c8e..556d529adf810 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.esnext.types +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.esnext.types @@ -9,11 +9,11 @@ const o1 = { } === tests/cases/conformance/emitter/esnext/asyncGenerators/O2.ts === const o2 = { ->o2 : { f(): AsyncIterableIterator; } ->{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } +>o2 : { f(): AsyncIterableIterator; } +>{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/generatorES6InAMDModule.types b/tests/baselines/reference/generatorES6InAMDModule.types index 9a12a72f0055a..d9c0b4d4ab5a8 100644 --- a/tests/baselines/reference/generatorES6InAMDModule.types +++ b/tests/baselines/reference/generatorES6InAMDModule.types @@ -1,6 +1,6 @@ === tests/cases/compiler/generatorES6InAMDModule.ts === export function* foo() { ->foo : () => IterableIterator +>foo : () => IterableIterator yield >yield : any diff --git a/tests/baselines/reference/generatorES6_1.types b/tests/baselines/reference/generatorES6_1.types index 13ac7c05844a6..b486948b9c2c1 100644 --- a/tests/baselines/reference/generatorES6_1.types +++ b/tests/baselines/reference/generatorES6_1.types @@ -1,6 +1,6 @@ === tests/cases/compiler/generatorES6_1.ts === function* foo() { ->foo : () => IterableIterator +>foo : () => IterableIterator yield >yield : any diff --git a/tests/baselines/reference/generatorTypeCheck48.errors.txt b/tests/baselines/reference/generatorTypeCheck48.errors.txt deleted file mode 100644 index 867a0c35f6045..0000000000000 --- a/tests/baselines/reference/generatorTypeCheck48.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -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 errors) ==== - function* g() { - ~ -!!! error TS7025: Generator implicitly has type 'IterableIterator' because it does not yield any values. Consider supplying a return type. - yield; - } \ No newline at end of file diff --git a/tests/baselines/reference/generatorTypeCheck48.types b/tests/baselines/reference/generatorTypeCheck48.types index e7c8f0ed01f3c..869bae6c54bc1 100644 --- a/tests/baselines/reference/generatorTypeCheck48.types +++ b/tests/baselines/reference/generatorTypeCheck48.types @@ -1,6 +1,6 @@ === tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts === function* g() { ->g : () => IterableIterator +>g : () => IterableIterator yield; >yield : any diff --git a/tests/baselines/reference/parser.asyncGenerators.classMethods.esnext.types b/tests/baselines/reference/parser.asyncGenerators.classMethods.esnext.types index 81636f0d9f351..186b8643c46e3 100644 --- a/tests/baselines/reference/parser.asyncGenerators.classMethods.esnext.types +++ b/tests/baselines/reference/parser.asyncGenerators.classMethods.esnext.types @@ -140,7 +140,7 @@ class C13 { >C13 : C13 async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator yield; >yield : any @@ -250,7 +250,7 @@ class C22 { >C22 : C22 async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = { [yield]: 1 }; >x : { [x: number]: number; } diff --git a/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.esnext.types b/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.esnext.types index d1ec77dd6aef2..cc9a46da70261 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.esnext.types +++ b/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.esnext.types @@ -88,7 +88,7 @@ async function * f12() { } === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldIsOk.ts === async function * f13() { ->f13 : () => AsyncIterableIterator +>f13 : () => AsyncIterableIterator yield; >yield : any @@ -157,7 +157,7 @@ async function * f20() { } === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldInNestedComputedPropertyIsOk.ts === async function * f21() { ->f21 : () => AsyncIterableIterator +>f21 : () => AsyncIterableIterator const x = { [yield]: 1 }; >x : { [x: number]: number; } diff --git a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.types b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.types index db905db6509ca..6d73ee200482a 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.types +++ b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.types @@ -113,8 +113,8 @@ const f12 = async function * () { }; === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldIsOk.ts === const f13 = async function * () { ->f13 : () => AsyncIterableIterator ->async function * () { yield;} : () => AsyncIterableIterator +>f13 : () => AsyncIterableIterator +>async function * () { yield;} : () => AsyncIterableIterator yield; >yield : any @@ -198,8 +198,8 @@ const f20 = async function * () { }; === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldInNestedComputedPropertyIsOk.ts === const f21 = async function *() { ->f21 : () => AsyncIterableIterator ->async function *() { const x = { [yield]: 1 };} : () => AsyncIterableIterator +>f21 : () => AsyncIterableIterator +>async function *() { const x = { [yield]: 1 };} : () => AsyncIterableIterator const x = { [yield]: 1 }; >x : { [x: number]: number; } diff --git a/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.esnext.types b/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.esnext.types index 4b159f793fe42..8c03ced33ddd4 100644 --- a/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.esnext.types +++ b/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.esnext.types @@ -151,11 +151,11 @@ const o12 = { }; === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldIsOk.ts === const o13 = { ->o13 : { f(): AsyncIterableIterator; } ->{ async * f() { yield; }} : { f(): AsyncIterableIterator; } +>o13 : { f(): AsyncIterableIterator; } +>{ async * f() { yield; }} : { f(): AsyncIterableIterator; } async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator yield; >yield : any @@ -260,11 +260,11 @@ const o20 = { }; === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldInNestedComputedPropertyIsOk.ts === const o21 = { ->o21 : { f(): AsyncIterableIterator; } ->{ async * f() { const x = { [yield]: 1 }; }} : { f(): AsyncIterableIterator; } +>o21 : { f(): AsyncIterableIterator; } +>{ async * f() { const x = { [yield]: 1 }; }} : { f(): AsyncIterableIterator; } async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = { [yield]: 1 }; >x : { [x: number]: number; } diff --git a/tests/baselines/reference/types.asyncGenerators.esnext.1.types b/tests/baselines/reference/types.asyncGenerators.esnext.1.types index 6e29e9cc95cab..a07a1c7bf568e 100644 --- a/tests/baselines/reference/types.asyncGenerators.esnext.1.types +++ b/tests/baselines/reference/types.asyncGenerators.esnext.1.types @@ -3,7 +3,7 @@ async function * inferReturnType1() { >inferReturnType1 : () => AsyncIterableIterator } async function * inferReturnType2() { ->inferReturnType2 : () => AsyncIterableIterator +>inferReturnType2 : () => AsyncIterableIterator yield; >yield : any diff --git a/tests/baselines/reference/yieldExpression1.errors.txt b/tests/baselines/reference/yieldExpression1.errors.txt new file mode 100644 index 0000000000000..c7d7192859ba8 --- /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 e4d5748a7617d..67c329010e12b 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 7ca4678804740..fb7c2b585f8c0 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 1ef54eb5f3d27..d774004637f3b 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 1f2137b8403d6..ef5b543930df1 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; +} From f910468ac1f9fbcea722d12d4c04eb58fffc13e1 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 2 Mar 2018 10:19:22 -0800 Subject: [PATCH 2/2] Use undefinedWideningType --- src/compiler/checker.ts | 2 +- .../reference/FunctionDeclaration9_es6.types | 10 +++++----- .../reference/YieldExpression13_es6.types | 2 +- .../reference/YieldExpression3_es6.types | 2 +- .../reference/YieldExpression4_es6.types | 2 +- ...er.asyncGenerators.classMethods.es2015.types | 2 +- ...itter.asyncGenerators.classMethods.es5.types | 2 +- ...er.asyncGenerators.classMethods.esnext.types | 2 +- ...Generators.functionDeclarations.es2015.types | 2 +- ...yncGenerators.functionDeclarations.es5.types | 2 +- ...Generators.functionDeclarations.esnext.types | 2 +- ...cGenerators.functionExpressions.es2015.types | 4 ++-- ...syncGenerators.functionExpressions.es5.types | 4 ++-- ...cGenerators.functionExpressions.esnext.types | 4 ++-- ...Generators.objectLiteralMethods.es2015.types | 6 +++--- ...yncGenerators.objectLiteralMethods.es5.types | 6 +++--- ...Generators.objectLiteralMethods.esnext.types | 6 +++--- .../reference/generatorES6InAMDModule.types | 2 +- tests/baselines/reference/generatorES6_1.types | 2 +- .../reference/generatorTypeCheck48.errors.txt | 17 +++++++++++++++++ .../baselines/reference/generatorTypeCheck48.js | 10 +++++++++- .../reference/generatorTypeCheck48.symbols | 8 ++++++++ .../reference/generatorTypeCheck48.types | 11 ++++++++++- ...er.asyncGenerators.classMethods.esnext.types | 4 ++-- ...Generators.functionDeclarations.esnext.types | 4 ++-- ...cGenerators.functionExpressions.esnext.types | 8 ++++---- ...Generators.objectLiteralMethods.esnext.types | 12 ++++++------ .../types.asyncGenerators.esnext.1.types | 2 +- .../yieldExpressions/generatorTypeCheck48.ts | 6 +++++- 29 files changed, 96 insertions(+), 50 deletions(-) create mode 100644 tests/baselines/reference/generatorTypeCheck48.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1e72b3bd6422b..918868cccf4ab 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -18389,7 +18389,7 @@ namespace ts { function getYieldedTypeOfYieldExpression(node: YieldExpression, isAsync: boolean, checkMode?: CheckMode): Type { const errorNode = node.expression || node; - const expressionType = node.expression ? checkExpressionCached(node.expression, checkMode) : undefinedType; + const expressionType = node.expression ? checkExpressionCached(node.expression, checkMode) : undefinedWideningType; // A yield* expression effectively yields everything that its operand yields const yieldedType = node.asteriskToken ? checkIteratedTypeOrElementType(expressionType, errorNode, /*allowStringInput*/ false, isAsync) : expressionType; return !isAsync ? yieldedType : getAwaitedType(yieldedType, errorNode, node.asteriskToken diff --git a/tests/baselines/reference/FunctionDeclaration9_es6.types b/tests/baselines/reference/FunctionDeclaration9_es6.types index ec6733b9ad08e..2b915b82a67b1 100644 --- a/tests/baselines/reference/FunctionDeclaration9_es6.types +++ b/tests/baselines/reference/FunctionDeclaration9_es6.types @@ -1,11 +1,11 @@ === tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration9_es6.ts === function * foo() { ->foo : () => IterableIterator +>foo : () => IterableIterator var v = { [yield]: foo } ->v : { [x: number]: () => IterableIterator; } ->{ [yield]: foo } : { [x: number]: () => IterableIterator; } ->[yield] : () => IterableIterator +>v : { [x: number]: () => IterableIterator; } +>{ [yield]: foo } : { [x: number]: () => IterableIterator; } +>[yield] : () => IterableIterator >yield : any ->foo : () => IterableIterator +>foo : () => IterableIterator } diff --git a/tests/baselines/reference/YieldExpression13_es6.types b/tests/baselines/reference/YieldExpression13_es6.types index 1ad2f4817b1be..011ac1e09e8fe 100644 --- a/tests/baselines/reference/YieldExpression13_es6.types +++ b/tests/baselines/reference/YieldExpression13_es6.types @@ -1,5 +1,5 @@ === tests/cases/conformance/es6/yieldExpressions/YieldExpression13_es6.ts === function* foo() { yield } ->foo : () => IterableIterator +>foo : () => IterableIterator >yield : any diff --git a/tests/baselines/reference/YieldExpression3_es6.types b/tests/baselines/reference/YieldExpression3_es6.types index 18d9276100a2a..9e2f810d91129 100644 --- a/tests/baselines/reference/YieldExpression3_es6.types +++ b/tests/baselines/reference/YieldExpression3_es6.types @@ -1,6 +1,6 @@ === tests/cases/conformance/es6/yieldExpressions/YieldExpression3_es6.ts === function* foo() { ->foo : () => IterableIterator +>foo : () => IterableIterator yield >yield : any diff --git a/tests/baselines/reference/YieldExpression4_es6.types b/tests/baselines/reference/YieldExpression4_es6.types index 26737f5c5bcf8..929bef38edd1d 100644 --- a/tests/baselines/reference/YieldExpression4_es6.types +++ b/tests/baselines/reference/YieldExpression4_es6.types @@ -1,6 +1,6 @@ === tests/cases/conformance/es6/yieldExpressions/YieldExpression4_es6.ts === function* foo() { ->foo : () => IterableIterator +>foo : () => IterableIterator yield; >yield : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.types b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.types index d468091f1af49..c6d6fb6758d13 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.types +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.types @@ -11,7 +11,7 @@ class C2 { >C2 : C2 async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.types b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.types index 21512c4b64c53..5d636d2400c6f 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.types +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.types @@ -11,7 +11,7 @@ class C2 { >C2 : C2 async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.esnext.types b/tests/baselines/reference/emitter.asyncGenerators.classMethods.esnext.types index 920a5d69ad8b2..f2f5f4d7503bd 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.esnext.types +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.esnext.types @@ -11,7 +11,7 @@ class C2 { >C2 : C2 async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.types b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.types index ec2d895ee3a8e..15ff1298b21ac 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.types @@ -4,7 +4,7 @@ async function * f1() { } === tests/cases/conformance/emitter/es2015/asyncGenerators/F2.ts === async function * f2() { ->f2 : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.types b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.types index 33ccbf70a8817..6220f5efd1eca 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.types @@ -4,7 +4,7 @@ async function * f1() { } === tests/cases/conformance/emitter/es5/asyncGenerators/F2.ts === async function * f2() { ->f2 : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.esnext.types b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.esnext.types index 0a6ddcd527296..c0d8011774655 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.esnext.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.esnext.types @@ -4,7 +4,7 @@ async function * f1() { } === tests/cases/conformance/emitter/esnext/asyncGenerators/F2.ts === async function * f2() { ->f2 : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.types b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.types index f3e44242253ba..1db2126b7ed83 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.types @@ -5,8 +5,8 @@ const f1 = async function * () { } === tests/cases/conformance/emitter/es2015/asyncGenerators/F2.ts === const f2 = async function * () { ->f2 : () => AsyncIterableIterator ->async function * () { const x = yield;} : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator +>async function * () { const x = yield;} : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.types b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.types index 35826515fa13d..e9da600bdbf1c 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.types @@ -5,8 +5,8 @@ const f1 = async function * () { } === tests/cases/conformance/emitter/es5/asyncGenerators/F2.ts === const f2 = async function * () { ->f2 : () => AsyncIterableIterator ->async function * () { const x = yield;} : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator +>async function * () { const x = yield;} : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.esnext.types b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.esnext.types index 6268996754d65..5802bc10a2d9e 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.esnext.types +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.esnext.types @@ -5,8 +5,8 @@ const f1 = async function * () { } === tests/cases/conformance/emitter/esnext/asyncGenerators/F2.ts === const f2 = async function * () { ->f2 : () => AsyncIterableIterator ->async function * () { const x = yield;} : () => AsyncIterableIterator +>f2 : () => AsyncIterableIterator +>async function * () { const x = yield;} : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.types b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.types index 1a447be3287eb..9e47fc9d98932 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.types +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.types @@ -9,11 +9,11 @@ const o1 = { } === tests/cases/conformance/emitter/es2015/asyncGenerators/O2.ts === const o2 = { ->o2 : { f(): AsyncIterableIterator; } ->{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } +>o2 : { f(): AsyncIterableIterator; } +>{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.types b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.types index f8e44b8b5d8b3..390007605083d 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.types +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.types @@ -9,11 +9,11 @@ const o1 = { } === tests/cases/conformance/emitter/es5/asyncGenerators/O2.ts === const o2 = { ->o2 : { f(): AsyncIterableIterator; } ->{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } +>o2 : { f(): AsyncIterableIterator; } +>{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.esnext.types b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.esnext.types index 556d529adf810..a05b5326b2c8e 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.esnext.types +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.esnext.types @@ -9,11 +9,11 @@ const o1 = { } === tests/cases/conformance/emitter/esnext/asyncGenerators/O2.ts === const o2 = { ->o2 : { f(): AsyncIterableIterator; } ->{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } +>o2 : { f(): AsyncIterableIterator; } +>{ async * f() { const x = yield; }} : { f(): AsyncIterableIterator; } async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = yield; >x : any diff --git a/tests/baselines/reference/generatorES6InAMDModule.types b/tests/baselines/reference/generatorES6InAMDModule.types index d9c0b4d4ab5a8..9a12a72f0055a 100644 --- a/tests/baselines/reference/generatorES6InAMDModule.types +++ b/tests/baselines/reference/generatorES6InAMDModule.types @@ -1,6 +1,6 @@ === tests/cases/compiler/generatorES6InAMDModule.ts === export function* foo() { ->foo : () => IterableIterator +>foo : () => IterableIterator yield >yield : any diff --git a/tests/baselines/reference/generatorES6_1.types b/tests/baselines/reference/generatorES6_1.types index b486948b9c2c1..13ac7c05844a6 100644 --- a/tests/baselines/reference/generatorES6_1.types +++ b/tests/baselines/reference/generatorES6_1.types @@ -1,6 +1,6 @@ === tests/cases/compiler/generatorES6_1.ts === function* foo() { ->foo : () => IterableIterator +>foo : () => IterableIterator yield >yield : any diff --git a/tests/baselines/reference/generatorTypeCheck48.errors.txt b/tests/baselines/reference/generatorTypeCheck48.errors.txt new file mode 100644 index 0000000000000..a3a9706175f26 --- /dev/null +++ b/tests/baselines/reference/generatorTypeCheck48.errors.txt @@ -0,0 +1,17 @@ +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 (2 errors) ==== + function* g() { + ~ +!!! error TS7010: 'g', which lacks return-type annotation, implicitly has an 'any' return type. + yield; + } + + 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 f4ce9fbb3345d..a584681b93e68 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 323f799abe187..44254586ad90d 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 869bae6c54bc1..f07131595cdbc 100644 --- a/tests/baselines/reference/generatorTypeCheck48.types +++ b/tests/baselines/reference/generatorTypeCheck48.types @@ -1,7 +1,16 @@ === tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts === function* g() { ->g : () => IterableIterator +>g : () => IterableIterator yield; >yield : any } + +function* h() { +>h : () => IterableIterator + + yield undefined; +>yield undefined : any +>undefined : undefined +} + diff --git a/tests/baselines/reference/parser.asyncGenerators.classMethods.esnext.types b/tests/baselines/reference/parser.asyncGenerators.classMethods.esnext.types index 186b8643c46e3..81636f0d9f351 100644 --- a/tests/baselines/reference/parser.asyncGenerators.classMethods.esnext.types +++ b/tests/baselines/reference/parser.asyncGenerators.classMethods.esnext.types @@ -140,7 +140,7 @@ class C13 { >C13 : C13 async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator yield; >yield : any @@ -250,7 +250,7 @@ class C22 { >C22 : C22 async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = { [yield]: 1 }; >x : { [x: number]: number; } diff --git a/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.esnext.types b/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.esnext.types index cc9a46da70261..d1ec77dd6aef2 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.esnext.types +++ b/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.esnext.types @@ -88,7 +88,7 @@ async function * f12() { } === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldIsOk.ts === async function * f13() { ->f13 : () => AsyncIterableIterator +>f13 : () => AsyncIterableIterator yield; >yield : any @@ -157,7 +157,7 @@ async function * f20() { } === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldInNestedComputedPropertyIsOk.ts === async function * f21() { ->f21 : () => AsyncIterableIterator +>f21 : () => AsyncIterableIterator const x = { [yield]: 1 }; >x : { [x: number]: number; } diff --git a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.types b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.types index 6d73ee200482a..db905db6509ca 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.types +++ b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.types @@ -113,8 +113,8 @@ const f12 = async function * () { }; === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldIsOk.ts === const f13 = async function * () { ->f13 : () => AsyncIterableIterator ->async function * () { yield;} : () => AsyncIterableIterator +>f13 : () => AsyncIterableIterator +>async function * () { yield;} : () => AsyncIterableIterator yield; >yield : any @@ -198,8 +198,8 @@ const f20 = async function * () { }; === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldInNestedComputedPropertyIsOk.ts === const f21 = async function *() { ->f21 : () => AsyncIterableIterator ->async function *() { const x = { [yield]: 1 };} : () => AsyncIterableIterator +>f21 : () => AsyncIterableIterator +>async function *() { const x = { [yield]: 1 };} : () => AsyncIterableIterator const x = { [yield]: 1 }; >x : { [x: number]: number; } diff --git a/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.esnext.types b/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.esnext.types index 8c03ced33ddd4..4b159f793fe42 100644 --- a/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.esnext.types +++ b/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.esnext.types @@ -151,11 +151,11 @@ const o12 = { }; === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldIsOk.ts === const o13 = { ->o13 : { f(): AsyncIterableIterator; } ->{ async * f() { yield; }} : { f(): AsyncIterableIterator; } +>o13 : { f(): AsyncIterableIterator; } +>{ async * f() { yield; }} : { f(): AsyncIterableIterator; } async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator yield; >yield : any @@ -260,11 +260,11 @@ const o20 = { }; === tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldInNestedComputedPropertyIsOk.ts === const o21 = { ->o21 : { f(): AsyncIterableIterator; } ->{ async * f() { const x = { [yield]: 1 }; }} : { f(): AsyncIterableIterator; } +>o21 : { f(): AsyncIterableIterator; } +>{ async * f() { const x = { [yield]: 1 }; }} : { f(): AsyncIterableIterator; } async * f() { ->f : () => AsyncIterableIterator +>f : () => AsyncIterableIterator const x = { [yield]: 1 }; >x : { [x: number]: number; } diff --git a/tests/baselines/reference/types.asyncGenerators.esnext.1.types b/tests/baselines/reference/types.asyncGenerators.esnext.1.types index a07a1c7bf568e..6e29e9cc95cab 100644 --- a/tests/baselines/reference/types.asyncGenerators.esnext.1.types +++ b/tests/baselines/reference/types.asyncGenerators.esnext.1.types @@ -3,7 +3,7 @@ async function * inferReturnType1() { >inferReturnType1 : () => AsyncIterableIterator } async function * inferReturnType2() { ->inferReturnType2 : () => AsyncIterableIterator +>inferReturnType2 : () => AsyncIterableIterator yield; >yield : any diff --git a/tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts b/tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts index 65885f28a5bd7..11c5ecfb8006b 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; +}