Skip to content

Commit 3e42791

Browse files
author
Artem Tyurin
committed
Resolve promise inside async generator
1 parent b172311 commit 3e42791

13 files changed

+568
-71
lines changed

src/compiler/transformers/esnext.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,14 @@ namespace ts {
906906
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
907907
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
908908
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
909-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
909+
function step(r) {
910+
if (r.value instanceof __await) {
911+
Promise.resolve(r.value.v).then(fulfill, reject);
912+
} else if (r.value instanceof Promise) {
913+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
914+
} else { settle(q[0][2], r); }
915+
}
916+
function resolve(r, rv) { return { value: rv, done: r.done }; }
910917
function fulfill(value) { resume("next", value); }
911918
function reject(value) { resume("throw", value); }
912919
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }

tests/baselines/reference/asyncImportNestedYield.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,14 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
3838
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
3939
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
4040
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
41-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
41+
function step(r) {
42+
if (r.value instanceof __await) {
43+
Promise.resolve(r.value.v).then(fulfill, reject);
44+
} else if (r.value instanceof Promise) {
45+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
46+
} else { settle(q[0][2], r); }
47+
}
48+
function resolve(r, rv) { return { value: rv, done: r.done }; }
4249
function fulfill(value) { resume("next", value); }
4350
function reject(value) { resume("throw", value); }
4451
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }

tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js

Lines changed: 72 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,14 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
6868
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
6969
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
7070
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
71-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
71+
function step(r) {
72+
if (r.value instanceof __await) {
73+
Promise.resolve(r.value.v).then(fulfill, reject);
74+
} else if (r.value instanceof Promise) {
75+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
76+
} else { settle(q[0][2], r); }
77+
}
78+
function resolve(r, rv) { return { value: rv, done: r.done }; }
7279
function fulfill(value) { resume("next", value); }
7380
function reject(value) { resume("throw", value); }
7481
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -87,7 +94,14 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
8794
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
8895
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
8996
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
90-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
97+
function step(r) {
98+
if (r.value instanceof __await) {
99+
Promise.resolve(r.value.v).then(fulfill, reject);
100+
} else if (r.value instanceof Promise) {
101+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
102+
} else { settle(q[0][2], r); }
103+
}
104+
function resolve(r, rv) { return { value: rv, done: r.done }; }
91105
function fulfill(value) { resume("next", value); }
92106
function reject(value) { resume("throw", value); }
93107
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -107,7 +121,14 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
107121
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
108122
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
109123
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
110-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
124+
function step(r) {
125+
if (r.value instanceof __await) {
126+
Promise.resolve(r.value.v).then(fulfill, reject);
127+
} else if (r.value instanceof Promise) {
128+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
129+
} else { settle(q[0][2], r); }
130+
}
131+
function resolve(r, rv) { return { value: rv, done: r.done }; }
111132
function fulfill(value) { resume("next", value); }
112133
function reject(value) { resume("throw", value); }
113134
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -137,7 +158,14 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
137158
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
138159
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
139160
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
140-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
161+
function step(r) {
162+
if (r.value instanceof __await) {
163+
Promise.resolve(r.value.v).then(fulfill, reject);
164+
} else if (r.value instanceof Promise) {
165+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
166+
} else { settle(q[0][2], r); }
167+
}
168+
function resolve(r, rv) { return { value: rv, done: r.done }; }
141169
function fulfill(value) { resume("next", value); }
142170
function reject(value) { resume("throw", value); }
143171
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -157,7 +185,14 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
157185
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
158186
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
159187
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
160-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
188+
function step(r) {
189+
if (r.value instanceof __await) {
190+
Promise.resolve(r.value.v).then(fulfill, reject);
191+
} else if (r.value instanceof Promise) {
192+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
193+
} else { settle(q[0][2], r); }
194+
}
195+
function resolve(r, rv) { return { value: rv, done: r.done }; }
161196
function fulfill(value) { resume("next", value); }
162197
function reject(value) { resume("throw", value); }
163198
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -187,7 +222,14 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
187222
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
188223
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
189224
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
190-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
225+
function step(r) {
226+
if (r.value instanceof __await) {
227+
Promise.resolve(r.value.v).then(fulfill, reject);
228+
} else if (r.value instanceof Promise) {
229+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
230+
} else { settle(q[0][2], r); }
231+
}
232+
function resolve(r, rv) { return { value: rv, done: r.done }; }
191233
function fulfill(value) { resume("next", value); }
192234
function reject(value) { resume("throw", value); }
193235
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -207,7 +249,14 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
207249
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
208250
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
209251
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
210-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
252+
function step(r) {
253+
if (r.value instanceof __await) {
254+
Promise.resolve(r.value.v).then(fulfill, reject);
255+
} else if (r.value instanceof Promise) {
256+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
257+
} else { settle(q[0][2], r); }
258+
}
259+
function resolve(r, rv) { return { value: rv, done: r.done }; }
211260
function fulfill(value) { resume("next", value); }
212261
function reject(value) { resume("throw", value); }
213262
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -227,7 +276,14 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
227276
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
228277
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
229278
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
230-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
279+
function step(r) {
280+
if (r.value instanceof __await) {
281+
Promise.resolve(r.value.v).then(fulfill, reject);
282+
} else if (r.value instanceof Promise) {
283+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
284+
} else { settle(q[0][2], r); }
285+
}
286+
function resolve(r, rv) { return { value: rv, done: r.done }; }
231287
function fulfill(value) { resume("next", value); }
232288
function reject(value) { resume("throw", value); }
233289
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -249,7 +305,14 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
249305
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
250306
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
251307
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
252-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
308+
function step(r) {
309+
if (r.value instanceof __await) {
310+
Promise.resolve(r.value.v).then(fulfill, reject);
311+
} else if (r.value instanceof Promise) {
312+
r.value.then(function(rv) { settle(q[0][2], resolve(r, rv)); }, function(e) { settle(q[0][3], resolve(r, e)); });
313+
} else { settle(q[0][2], r); }
314+
}
315+
function resolve(r, rv) { return { value: rv, done: r.done }; }
253316
function fulfill(value) { resume("next", value); }
254317
function reject(value) { resume("throw", value); }
255318
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }

0 commit comments

Comments
 (0)