Skip to content

Commit 03b9066

Browse files
authored
Merge pull request #12346 from Microsoft/asyncGenerators
Async Iteration and down-level Generators
2 parents 8a5bebe + 11f58ea commit 03b9066

File tree

348 files changed

+16826
-3054
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

348 files changed

+16826
-3054
lines changed

Diff for: Gulpfile.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,14 @@ const es2017LibrarySourceMap = es2017LibrarySource.map(function(source) {
138138
return { target: "lib." + source, sources: ["header.d.ts", source] };
139139
});
140140

141+
const esnextLibrarySource = [
142+
"esnext.asynciterable.d.ts"
143+
];
144+
145+
const esnextLibrarySourceMap = esnextLibrarySource.map(function (source) {
146+
return { target: "lib." + source, sources: ["header.d.ts", source] };
147+
});
148+
141149
const hostsLibrarySources = ["dom.generated.d.ts", "webworker.importscripts.d.ts", "scripthost.d.ts"];
142150

143151
const librarySourceMap = [
@@ -152,11 +160,12 @@ const librarySourceMap = [
152160
{ target: "lib.es2015.d.ts", sources: ["header.d.ts", "es2015.d.ts"] },
153161
{ target: "lib.es2016.d.ts", sources: ["header.d.ts", "es2016.d.ts"] },
154162
{ target: "lib.es2017.d.ts", sources: ["header.d.ts", "es2017.d.ts"] },
163+
{ target: "lib.esnext.d.ts", sources: ["header.d.ts", "esnext.d.ts"] },
155164

156165
// JavaScript + all host library
157166
{ target: "lib.d.ts", sources: ["header.d.ts", "es5.d.ts"].concat(hostsLibrarySources) },
158167
{ target: "lib.es6.d.ts", sources: ["header.d.ts", "es5.d.ts"].concat(es2015LibrarySources, hostsLibrarySources, "dom.iterable.d.ts") }
159-
].concat(es2015LibrarySourceMap, es2016LibrarySourceMap, es2017LibrarySourceMap);
168+
].concat(es2015LibrarySourceMap, es2016LibrarySourceMap, es2017LibrarySourceMap, esnextLibrarySourceMap);
160169

161170
const libraryTargets = librarySourceMap.map(function(f) {
162171
return path.join(builtLocalDirectory, f.target);

Diff for: Jakefile.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -172,13 +172,21 @@ var es2016LibrarySourceMap = es2016LibrarySource.map(function (source) {
172172
var es2017LibrarySource = [
173173
"es2017.object.d.ts",
174174
"es2017.sharedmemory.d.ts",
175-
"es2017.string.d.ts",
175+
"es2017.string.d.ts"
176176
];
177177

178178
var es2017LibrarySourceMap = es2017LibrarySource.map(function (source) {
179179
return { target: "lib." + source, sources: ["header.d.ts", source] };
180180
});
181181

182+
var esnextLibrarySource = [
183+
"esnext.asynciterable.d.ts"
184+
];
185+
186+
var esnextLibrarySourceMap = esnextLibrarySource.map(function (source) {
187+
return { target: "lib." + source, sources: ["header.d.ts", source] };
188+
});
189+
182190
var hostsLibrarySources = ["dom.generated.d.ts", "webworker.importscripts.d.ts", "scripthost.d.ts"];
183191

184192
var librarySourceMap = [
@@ -193,11 +201,12 @@ var librarySourceMap = [
193201
{ target: "lib.es2015.d.ts", sources: ["header.d.ts", "es2015.d.ts"] },
194202
{ target: "lib.es2016.d.ts", sources: ["header.d.ts", "es2016.d.ts"] },
195203
{ target: "lib.es2017.d.ts", sources: ["header.d.ts", "es2017.d.ts"] },
204+
{ target: "lib.esnext.d.ts", sources: ["header.d.ts", "esnext.d.ts"] },
196205

197206
// JavaScript + all host library
198207
{ target: "lib.d.ts", sources: ["header.d.ts", "es5.d.ts"].concat(hostsLibrarySources) },
199208
{ target: "lib.es6.d.ts", sources: ["header.d.ts", "es5.d.ts"].concat(es2015LibrarySources, hostsLibrarySources, "dom.iterable.d.ts") }
200-
].concat(es2015LibrarySourceMap, es2016LibrarySourceMap, es2017LibrarySourceMap);
209+
].concat(es2015LibrarySourceMap, es2016LibrarySourceMap, es2017LibrarySourceMap, esnextLibrarySourceMap);
201210

202211
var libraryTargets = librarySourceMap.map(function (f) {
203212
return path.join(builtLocalDirectory, f.target);

Diff for: src/compiler/binder.ts

+25-20
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,9 @@ namespace ts {
957957
const postLoopLabel = createBranchLabel();
958958
addAntecedent(preLoopLabel, currentFlow);
959959
currentFlow = preLoopLabel;
960+
if (node.kind === SyntaxKind.ForOfStatement) {
961+
bind(node.awaitModifier);
962+
}
960963
bind(node.expression);
961964
addAntecedent(postLoopLabel, currentFlow);
962965
bind(node.initializer);
@@ -2407,7 +2410,7 @@ namespace ts {
24072410

24082411
function bindFunctionDeclaration(node: FunctionDeclaration) {
24092412
if (!isDeclarationFile(file) && !isInAmbientContext(node)) {
2410-
if (isAsyncFunctionLike(node)) {
2413+
if (isAsyncFunction(node)) {
24112414
emitFlags |= NodeFlags.HasAsyncFunctions;
24122415
}
24132416
}
@@ -2424,7 +2427,7 @@ namespace ts {
24242427

24252428
function bindFunctionExpression(node: FunctionExpression) {
24262429
if (!isDeclarationFile(file) && !isInAmbientContext(node)) {
2427-
if (isAsyncFunctionLike(node)) {
2430+
if (isAsyncFunction(node)) {
24282431
emitFlags |= NodeFlags.HasAsyncFunctions;
24292432
}
24302433
}
@@ -2438,7 +2441,7 @@ namespace ts {
24382441

24392442
function bindPropertyOrMethodOrAccessor(node: Declaration, symbolFlags: SymbolFlags, symbolExcludes: SymbolFlags) {
24402443
if (!isDeclarationFile(file) && !isInAmbientContext(node)) {
2441-
if (isAsyncFunctionLike(node)) {
2444+
if (isAsyncFunction(node)) {
24422445
emitFlags |= NodeFlags.HasAsyncFunctions;
24432446
}
24442447
}
@@ -2872,11 +2875,10 @@ namespace ts {
28722875

28732876
// An async method declaration is ES2017 syntax.
28742877
if (hasModifier(node, ModifierFlags.Async)) {
2875-
transformFlags |= TransformFlags.AssertES2017;
2878+
transformFlags |= node.asteriskToken ? TransformFlags.AssertESNext : TransformFlags.AssertES2017;
28762879
}
28772880

2878-
// Currently, we only support generators that were originally async function bodies.
2879-
if (node.asteriskToken && getEmitFlags(node) & EmitFlags.AsyncFunctionBody) {
2881+
if (node.asteriskToken) {
28802882
transformFlags |= TransformFlags.AssertGenerator;
28812883
}
28822884

@@ -2942,7 +2944,7 @@ namespace ts {
29422944

29432945
// An async function declaration is ES2017 syntax.
29442946
if (modifierFlags & ModifierFlags.Async) {
2945-
transformFlags |= TransformFlags.AssertES2017;
2947+
transformFlags |= node.asteriskToken ? TransformFlags.AssertESNext : TransformFlags.AssertES2017;
29462948
}
29472949

29482950
// function declarations with object rest destructuring are ES Next syntax
@@ -2962,7 +2964,7 @@ namespace ts {
29622964
// down-level generator.
29632965
// Currently we do not support transforming any other generator fucntions
29642966
// down level.
2965-
if (node.asteriskToken && getEmitFlags(node) & EmitFlags.AsyncFunctionBody) {
2967+
if (node.asteriskToken) {
29662968
transformFlags |= TransformFlags.AssertGenerator;
29672969
}
29682970
}
@@ -2984,7 +2986,7 @@ namespace ts {
29842986

29852987
// An async function expression is ES2017 syntax.
29862988
if (hasModifier(node, ModifierFlags.Async)) {
2987-
transformFlags |= TransformFlags.AssertES2017;
2989+
transformFlags |= node.asteriskToken ? TransformFlags.AssertESNext : TransformFlags.AssertES2017;
29882990
}
29892991

29902992
// function expressions with object rest destructuring are ES Next syntax
@@ -3003,9 +3005,7 @@ namespace ts {
30033005
// If a FunctionExpression is generator function and is the body of a
30043006
// transformed async function, then this node can be transformed to a
30053007
// down-level generator.
3006-
// Currently we do not support transforming any other generator fucntions
3007-
// down level.
3008-
if (node.asteriskToken && getEmitFlags(node) & EmitFlags.AsyncFunctionBody) {
3008+
if (node.asteriskToken) {
30093009
transformFlags |= TransformFlags.AssertGenerator;
30103010
}
30113011

@@ -3173,8 +3173,8 @@ namespace ts {
31733173
switch (kind) {
31743174
case SyntaxKind.AsyncKeyword:
31753175
case SyntaxKind.AwaitExpression:
3176-
// async/await is ES2017 syntax
3177-
transformFlags |= TransformFlags.AssertES2017;
3176+
// async/await is ES2017 syntax, but may be ESNext syntax (for async generators)
3177+
transformFlags |= TransformFlags.AssertESNext | TransformFlags.AssertES2017;
31783178
break;
31793179

31803180
case SyntaxKind.PublicKeyword:
@@ -3206,10 +3206,6 @@ namespace ts {
32063206
transformFlags |= TransformFlags.AssertJsx;
32073207
break;
32083208

3209-
case SyntaxKind.ForOfStatement:
3210-
// for-of might be ESNext if it has a rest destructuring
3211-
transformFlags |= TransformFlags.AssertESNext;
3212-
// FALLTHROUGH
32133209
case SyntaxKind.NoSubstitutionTemplateLiteral:
32143210
case SyntaxKind.TemplateHead:
32153211
case SyntaxKind.TemplateMiddle:
@@ -3223,9 +3219,18 @@ namespace ts {
32233219
transformFlags |= TransformFlags.AssertES2015;
32243220
break;
32253221

3222+
case SyntaxKind.ForOfStatement:
3223+
// This node is either ES2015 syntax or ES2017 syntax (if it is a for-await-of).
3224+
if ((<ForOfStatement>node).awaitModifier) {
3225+
transformFlags |= TransformFlags.AssertESNext;
3226+
}
3227+
transformFlags |= TransformFlags.AssertES2015;
3228+
break;
3229+
32263230
case SyntaxKind.YieldExpression:
3227-
// This node is ES6 syntax.
3228-
transformFlags |= TransformFlags.AssertES2015 | TransformFlags.ContainsYield;
3231+
// This node is either ES2015 syntax (in a generator) or ES2017 syntax (in an async
3232+
// generator).
3233+
transformFlags |= TransformFlags.AssertESNext | TransformFlags.AssertES2015 | TransformFlags.ContainsYield;
32293234
break;
32303235

32313236
case SyntaxKind.AnyKeyword:

0 commit comments

Comments
 (0)