Skip to content

Commit 4b5686a

Browse files
committed
Added emit transforms for async generators.
1 parent b5cc96c commit 4b5686a

17 files changed

Lines changed: 590 additions & 138 deletions

src/compiler/binder.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3062,15 +3062,20 @@ namespace ts {
30623062
case SyntaxKind.TemplateExpression:
30633063
case SyntaxKind.TaggedTemplateExpression:
30643064
case SyntaxKind.ShorthandPropertyAssignment:
3065-
case SyntaxKind.ForOfStatement:
30663065
case SyntaxKind.StaticKeyword:
30673066
// These nodes are ES6 syntax.
30683067
transformFlags |= TransformFlags.AssertES2015;
30693068
break;
30703069

3070+
case SyntaxKind.ForOfStatement:
3071+
// This node is either ES2015 syntax or ES2017 syntax (if it is a for-await-of).
3072+
transformFlags |= (<ForOfStatement>node).awaitKeyword ? TransformFlags.AssertES2017 : TransformFlags.AssertES2015;
3073+
break;
3074+
30713075
case SyntaxKind.YieldExpression:
3072-
// This node is ES6 syntax.
3073-
transformFlags |= TransformFlags.AssertES2015 | TransformFlags.ContainsYield;
3076+
// This node is either ES2015 syntax (in a generator) or ES2017 syntax (in an async
3077+
// generator).
3078+
transformFlags |= TransformFlags.AssertES2017 | TransformFlags.AssertES2015 | TransformFlags.ContainsYield;
30743079
break;
30753080

30763081
case SyntaxKind.AnyKeyword:

src/compiler/checker.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13531,7 +13531,7 @@ namespace ts {
1353113531
checkAsyncFunctionReturnType(node) : // Async function
1353213532
getTypeFromTypeNode(node.type)); // AsyncGenerator function, Generator function, or normal function
1353313533

13534-
if (functionFlags & FunctionFlags.Generator) { // AsyncGenerator function or Generator function
13534+
if ((functionFlags & FunctionFlags.Generator) === 0) { // Async function or normal function
1353513535
// return is not necessary in the body of generators
1353613536
checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType);
1353713537
}
@@ -20055,27 +20055,29 @@ namespace ts {
2005520055
getGlobalTemplateStringsArrayType = memoize(() => getGlobalType("TemplateStringsArray"));
2005620056

2005720057
if (languageVersion >= ScriptTarget.ES2017) {
20058-
getGlobalAsyncIteratorType = memoize(() => <GenericType>getGlobalType("AsyncIterator", /*arity*/ 1));
20059-
getGlobalAsyncIterableType = memoize(() => <GenericType>getGlobalType("AsyncIterable", /*arity*/ 1));
20060-
getGlobalAsyncIterableIteratorType = memoize(() => <GenericType>getGlobalType("AsyncIterableIterator", /*arity*/ 1));
20058+
getGlobalAsyncIteratorType = memoize(() => getGlobalType("AsyncIterator", /*arity*/ 1));
20059+
getGlobalAsyncIterableType = memoize(() => getGlobalType("AsyncIterable", /*arity*/ 1));
20060+
getGlobalAsyncIterableIteratorType = memoize(() => getGlobalType("AsyncIterableIterator", /*arity*/ 1));
2006120061
}
2006220062
else {
20063-
getGlobalAsyncIteratorType = memoize(() => emptyGenericType);
20064-
getGlobalAsyncIterableType = memoize(() => emptyGenericType);
20065-
getGlobalAsyncIterableIteratorType = memoize(() => emptyGenericType);
20063+
getGlobalAsyncIteratorType = memoize(() => getGlobalType("PseudoAsyncIterator", /*arity*/ 1));
20064+
getGlobalAsyncIterableType = memoize(() => getGlobalType("PseudoAsyncIterable", /*arity*/ 1));
20065+
getGlobalAsyncIterableIteratorType = memoize(() => getGlobalType("PseudoAsyncIterableIterator", /*arity*/ 1));
2006620066
}
2006720067

2006820068
if (languageVersion >= ScriptTarget.ES2015) {
2006920069
getGlobalESSymbolType = memoize(() => getGlobalType("Symbol"));
20070-
getGlobalIterableType = memoize(() => <GenericType>getGlobalType("Iterable", /*arity*/ 1));
20071-
getGlobalIterableIteratorType = memoize(() => <GenericType>getGlobalType("IterableIterator", /*arity*/ 1));
20070+
getGlobalIterableType = memoize(() => getGlobalType("Iterable", /*arity*/ 1));
20071+
getGlobalIterableIteratorType = memoize(() => getGlobalType("IterableIterator", /*arity*/ 1));
2007220072
}
2007320073
else {
2007420074
getGlobalESSymbolType = memoize(() => emptyObjectType);
20075-
getGlobalIterableType = memoize(() => <GenericType>getGlobalType("PseudoIterable", /*arity*/ 1));
20076-
getGlobalIterableIteratorType = memoize(() => <GenericType>getGlobalType("PseudoIterableIterator", /*arity*/ 1));
20075+
getGlobalIterableType = memoize(() => getGlobalType("PseudoIterable", /*arity*/ 1));
20076+
getGlobalIterableIteratorType = memoize(() => getGlobalType("PseudoIterableIterator", /*arity*/ 1));
2007720077
}
2007820078

20079+
getGlobalIteratorType = memoize(() => getGlobalType("Iterator", /*arity*/ 1));
20080+
2007920081
anyArrayType = createArrayType(anyType);
2008020082
autoArrayType = createArrayType(autoType);
2008120083

src/compiler/commandLineParser.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,8 +417,6 @@ namespace ts {
417417
"webworker": "lib.webworker.d.ts",
418418
"scripthost": "lib.scripthost.d.ts",
419419
// ES2015 Or ESNext By-feature options
420-
"iterator": "lib.iterator.d.ts",
421-
"pseudoiterable": "lib.pseudoiterable.d.ts",
422420
"es2015.core": "lib.es2015.core.d.ts",
423421
"es2015.collection": "lib.es2015.collection.d.ts",
424422
"es2015.generator": "lib.es2015.generator.d.ts",

src/compiler/factory.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1812,6 +1812,19 @@ namespace ts {
18121812

18131813
// Utilities
18141814

1815+
export function restoreEnclosingLabels(node: Statement, enclosingLabeledStatements: LabeledStatement[]) {
1816+
if (enclosingLabeledStatements) {
1817+
for (const labeledStatement of enclosingLabeledStatements) {
1818+
node = updateLabel(
1819+
labeledStatement,
1820+
labeledStatement.label,
1821+
node
1822+
);
1823+
}
1824+
}
1825+
return node;
1826+
}
1827+
18151828
export interface CallBinding {
18161829
target: LeftHandSideExpression;
18171830
thisArg: Expression;

src/compiler/transformers/destructuring.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ namespace ts {
253253
createReadHelper(
254254
context,
255255
boundValue,
256-
isEffectiveBindingElementWithRest(elements[numElements - 1])
256+
numElements > 0 && isEffectiveBindingElementWithRest(elements[numElements - 1])
257257
? undefined
258258
: numElements,
259259
location

src/compiler/transformers/es2015.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1978,19 +1978,6 @@ namespace ts {
19781978
return result;
19791979
}
19801980

1981-
function restoreEnclosingLabels(node: Statement, enclosingLabeledStatements: LabeledStatement[]) {
1982-
if (enclosingLabeledStatements) {
1983-
for (const labeledStatement of enclosingLabeledStatements) {
1984-
node = updateLabel(
1985-
labeledStatement,
1986-
labeledStatement.label,
1987-
node
1988-
);
1989-
}
1990-
}
1991-
return node;
1992-
}
1993-
19941981
function visitDoStatement(node: DoStatement) {
19951982
return convertIterationStatementBodyIfNecessary(node);
19961983
}

0 commit comments

Comments
 (0)