Skip to content

Commit d982014

Browse files
authored
Update __awaiter to be more spec compliant (#32462)
* Update __awaiter to be more spec compliant * Add awaiter evaluation test
1 parent 47e3fed commit d982014

File tree

91 files changed

+213
-94
lines changed

Some content is hidden

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

91 files changed

+213
-94
lines changed

src/compiler/transformers/es2017.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -775,10 +775,11 @@ namespace ts {
775775
priority: 5,
776776
text: `
777777
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
778+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
778779
return new (P || (P = Promise))(function (resolve, reject) {
779780
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
780781
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
781-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
782+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
782783
step((generator = generator.apply(thisArg, _arguments || [])).next());
783784
});
784785
};`

src/testRunner/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"unittests/config/tsconfigParsing.ts",
7474
"unittests/evaluation/asyncArrow.ts",
7575
"unittests/evaluation/asyncGenerator.ts",
76+
"unittests/evaluation/awaiter.ts",
7677
"unittests/evaluation/forAwaitOf.ts",
7778
"unittests/evaluation/objectRest.ts",
7879
"unittests/services/cancellableLanguageServiceOperations.ts",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
describe("unittests:: evaluation:: awaiter", () => {
2+
// NOTE: This could break if the ECMAScript spec ever changes the timing behavior for Promises (again)
3+
it("await (es5)", async () => {
4+
const result = evaluator.evaluateTypeScript(`
5+
async function a(msg: string) {
6+
await Promise.resolve();
7+
output.push(msg);
8+
}
9+
function b(msg: string) {
10+
return Promise.resolve().then(() => {
11+
output.push(msg);
12+
});
13+
}
14+
export const output: string[] = [];
15+
export async function main() {
16+
const p1 = a('1');
17+
const p2 = b('2');
18+
await Promise.all([p1, p2]);
19+
}
20+
`);
21+
await result.main();
22+
assert.deepEqual(result.output, ["1", "2"]);
23+
});
24+
});

tests/baselines/reference/asyncArrowFunction11_es5.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ class A {
99

1010
//// [asyncArrowFunction11_es5.js]
1111
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
12+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1213
return new (P || (P = Promise))(function (resolve, reject) {
1314
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1415
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
15-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
16+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1617
step((generator = generator.apply(thisArg, _arguments || [])).next());
1718
});
1819
};

tests/baselines/reference/asyncAwaitIsolatedModules_es5.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,11 @@ module M {
4242
//// [asyncAwaitIsolatedModules_es5.js]
4343
"use strict";
4444
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
45+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4546
return new (P || (P = Promise))(function (resolve, reject) {
4647
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
4748
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
48-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
49+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
4950
step((generator = generator.apply(thisArg, _arguments || [])).next());
5051
});
5152
};

tests/baselines/reference/asyncAwaitIsolatedModules_es6.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,11 @@ module M {
4141

4242
//// [asyncAwaitIsolatedModules_es6.js]
4343
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
44+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4445
return new (P || (P = Promise))(function (resolve, reject) {
4546
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
4647
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
47-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
48+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
4849
step((generator = generator.apply(thisArg, _arguments || [])).next());
4950
});
5051
};

tests/baselines/reference/asyncAwait_es5.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,11 @@ async function f14() {
4848

4949
//// [asyncAwait_es5.js]
5050
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
51+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5152
return new (P || (P = Promise))(function (resolve, reject) {
5253
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5354
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
54-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
55+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
5556
step((generator = generator.apply(thisArg, _arguments || [])).next());
5657
});
5758
};

tests/baselines/reference/asyncAwait_es6.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,11 @@ async function f14() {
4848

4949
//// [asyncAwait_es6.js]
5050
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
51+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5152
return new (P || (P = Promise))(function (resolve, reject) {
5253
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5354
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
54-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
55+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
5556
step((generator = generator.apply(thisArg, _arguments || [])).next());
5657
});
5758
};

tests/baselines/reference/asyncFunctionNoReturnType.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ async () => {
77

88
//// [asyncFunctionNoReturnType.js]
99
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
10+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1011
return new (P || (P = Promise))(function (resolve, reject) {
1112
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1213
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
14+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1415
step((generator = generator.apply(thisArg, _arguments || [])).next());
1516
});
1617
};

tests/baselines/reference/asyncFunctionReturnExpressionErrorSpans.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ async function asyncFoo(): Promise<Foo> {
2323

2424
//// [asyncFunctionReturnExpressionErrorSpans.js]
2525
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2627
return new (P || (P = Promise))(function (resolve, reject) {
2728
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
2829
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
29-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
30+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
3031
step((generator = generator.apply(thisArg, _arguments || [])).next());
3132
});
3233
};

tests/baselines/reference/asyncFunctionReturnType.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,11 @@ async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K
7777

7878
//// [asyncFunctionReturnType.js]
7979
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
80+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8081
return new (P || (P = Promise))(function (resolve, reject) {
8182
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8283
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
83-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
84+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8485
step((generator = generator.apply(thisArg, _arguments || [])).next());
8586
});
8687
};

tests/baselines/reference/asyncFunctionTempVariableScoping.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ async ({ foo, bar, ...rest }) => bar(await foo);
66
//// [asyncFunctionTempVariableScoping.js]
77
// https://github.com/Microsoft/TypeScript/issues/19187
88
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
910
return new (P || (P = Promise))(function (resolve, reject) {
1011
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1112
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
13+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1314
step((generator = generator.apply(thisArg, _arguments || [])).next());
1415
});
1516
};

tests/baselines/reference/asyncFunctionWithForStatementNoInitializer.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ async function test4() {
2626

2727
//// [asyncFunctionWithForStatementNoInitializer.js]
2828
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2930
return new (P || (P = Promise))(function (resolve, reject) {
3031
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
3132
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
32-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
33+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
3334
step((generator = generator.apply(thisArg, _arguments || [])).next());
3435
});
3536
};

tests/baselines/reference/asyncFunctionsAcrossFiles.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ export const b = {
1717

1818
//// [b.js]
1919
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
20+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2021
return new (P || (P = Promise))(function (resolve, reject) {
2122
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
2223
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
23-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
24+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
2425
step((generator = generator.apply(thisArg, _arguments || [])).next());
2526
});
2627
};
@@ -32,10 +33,11 @@ export const b = {
3233
};
3334
//// [a.js]
3435
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3537
return new (P || (P = Promise))(function (resolve, reject) {
3638
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
3739
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
38-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
40+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
3941
step((generator = generator.apply(thisArg, _arguments || [])).next());
4042
});
4143
};

tests/baselines/reference/asyncFunctionsAndStrictNullChecks.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ async function sample2(x?: number) {
2727

2828
//// [asyncFunctionsAndStrictNullChecks.js]
2929
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
30+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3031
return new (P || (P = Promise))(function (resolve, reject) {
3132
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
3233
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
34+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
3435
step((generator = generator.apply(thisArg, _arguments || [])).next());
3536
});
3637
};

tests/baselines/reference/asyncIIFE.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ function f1() {
1111

1212
//// [asyncIIFE.js]
1313
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1415
return new (P || (P = Promise))(function (resolve, reject) {
1516
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1617
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
18+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1819
step((generator = generator.apply(thisArg, _arguments || [])).next());
1920
});
2021
};

tests/baselines/reference/asyncImportedPromise_es5.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@ exports.Task = Task;
3636
//// [test.js]
3737
"use strict";
3838
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
39+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3940
return new (P || (P = Promise))(function (resolve, reject) {
4041
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
4142
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
42-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
43+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
4344
step((generator = generator.apply(thisArg, _arguments || [])).next());
4445
});
4546
};

tests/baselines/reference/asyncImportedPromise_es6.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ exports.Task = Task;
1818
//// [test.js]
1919
"use strict";
2020
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
21+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2122
return new (P || (P = Promise))(function (resolve, reject) {
2223
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
2324
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
24-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
25+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
2526
step((generator = generator.apply(thisArg, _arguments || [])).next());
2627
});
2728
};

tests/baselines/reference/asyncMethodWithSuperConflict_es6.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,11 @@ class B extends A {
6161

6262
//// [asyncMethodWithSuperConflict_es6.js]
6363
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
64+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6465
return new (P || (P = Promise))(function (resolve, reject) {
6566
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6667
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
67-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
68+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
6869
step((generator = generator.apply(thisArg, _arguments || [])).next());
6970
});
7071
};

tests/baselines/reference/asyncMultiFile_es5.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ function g() { }
77

88
//// [a.js]
99
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
10+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1011
return new (P || (P = Promise))(function (resolve, reject) {
1112
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1213
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
14+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1415
step((generator = generator.apply(thisArg, _arguments || [])).next());
1516
});
1617
};

tests/baselines/reference/asyncMultiFile_es6.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ function g() { }
77

88
//// [a.js]
99
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
10+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1011
return new (P || (P = Promise))(function (resolve, reject) {
1112
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1213
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13-
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
14+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1415
step((generator = generator.apply(thisArg, _arguments || [])).next());
1516
});
1617
};

0 commit comments

Comments
 (0)