Skip to content

Commit 278a350

Browse files
committed
Add support for external helpers module, cleanup, and accept new baselines.
1 parent 4eb2a82 commit 278a350

11 files changed

+273
-128
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17892,6 +17892,9 @@ namespace ts {
1789217892
}
1789317893
if (requestedExternalEmitHelpers & NodeFlags.HasAsyncFunctions) {
1789417894
verifyHelperSymbol(exports, "__awaiter", SymbolFlags.Value);
17895+
if (languageVersion < ScriptTarget.ES6) {
17896+
verifyHelperSymbol(exports, "__generator", SymbolFlags.Value);
17897+
}
1789517898
}
1789617899
}
1789717900
}

src/compiler/emitter.ts

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -73,51 +73,40 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7373

7474
const generatorHelper = `
7575
var __generator = (this && this.__generator) || function (body) {
76-
var _ = { label: 0, sent: function() { if (sent[0] === 1 /*throw*/) throw sent[1]; return sent[1]; }, trys: [], stack: [] }, sent;
76+
var _ = { label: 0, sent: function() { if (sent[0] === 1) throw sent[1]; return sent[1]; }, trys: [], stack: [] }, sent, f;
7777
function step(op) {
78-
if (_.flag) throw new TypeError("Generator is already executing.");
79-
while (true) {
78+
if (f) throw new TypeError("Generator is already executing.");
79+
while (1) {
8080
if (_.done) switch (op[0]) {
81-
case 0 /*next*/: return { value: void 0, done: true };
82-
case 1 /*throw*/: case 6 /*catch*/: throw op[1];
83-
case 2 /*return*/: return { value: op[1], done: true };
81+
case 0: return { value: void 0, done: true };
82+
case 1: case 6: throw op[1];
83+
case 2: return { value: op[1], done: true };
8484
}
8585
try {
86-
switch (_.flag = true, op[0]) {
87-
case 0 /*next*/: case 1 /*throw*/: sent = op; break;
88-
case 4 /*yield*/: return _.label++, { value: op[1], done: false };
89-
case 7 /*endfinally*/: op = _.stack.pop(), _.trys.pop(); continue;
86+
switch (f = 1, op[0]) {
87+
case 0: case 1: sent = op; break;
88+
case 4: return _.label++, { value: op[1], done: false };
89+
case 7: op = _.stack.pop(), _.trys.pop(); continue;
9090
default:
9191
var r = _.trys.length > 0 && _.trys[_.trys.length - 1];
92-
if (!r && (op[0] === 1 /*throw*/ || op[0] === 6 /*catch*/ || op[0] === 2 /*return*/)) {
93-
_.done = true;
94-
continue;
95-
}
96-
if (op[0] === 3 /*break*/ && (!r || (op[1] > r[0] && op[1] < r[3]))) {
97-
_.label = op[1];
98-
}
99-
else if (op[0] === 6 /*catch*/ && r && _.label < r[1]) {
100-
_.label = r[1], sent = op;
101-
}
102-
else if (r && _.label < r[2]) {
103-
_.label = r[2], _.stack.push(op);
104-
}
105-
else {
106-
if (r[2]) _.stack.pop();
107-
_.trys.pop();
108-
continue;
109-
}
92+
if (!r && (op[0] === 6 || op[0] === 2)) { _.done = 1; continue; }
93+
if (op[0] === 3 && (!r || (op[1] > r[0] && op[1] < r[3]))) { _.label = op[1]; break; }
94+
if (op[0] === 6 && _.label < r[1]) { _.label = r[1], sent = op; break; }
95+
if (r && _.label < r[2]) { _.label = r[2], _.stack.push(op); break; }
96+
if (r[2]) { _.stack.pop(); }
97+
_.trys.pop();
98+
continue;
11099
}
111100
op = body(_);
112101
}
113-
catch (e) { op = [6 /*catch*/, e]; }
114-
finally { _.flag = false, sent = void 0; }
102+
catch (e) { op = [6, e]; }
103+
finally { f = 0, sent = void 0; }
115104
}
116105
}
117106
return {
118-
next: function (v) { return step([0 /*next*/, v]); },
119-
"throw": function (v) { return step([1 /*throw*/, v]); },
120-
"return": function (v) { return step([2 /*return*/, v]); }
107+
next: function (v) { return step([0, v]); },
108+
"throw": function (v) { return step([1, v]); },
109+
"return": function (v) { return step([2, v]); }
121110
};
122111
};`;
123112

src/compiler/transformers/generators.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,7 @@ namespace ts {
137137
Endfinally // Marks the end of a `finally` block
138138
}
139139

140-
type OperationArguments = [Label]
141-
| [Label, Expression]
142-
| [Statement]
143-
| [Expression]
144-
| [Expression, Expression];
140+
type OperationArguments = [Label] | [Label, Expression] | [Statement] | [Expression] | [Expression, Expression];
145141

146142
// whether a generated code block is opening or closing at the current operation for a FunctionBuilder
147143
const enum BlockAction {
@@ -245,6 +241,7 @@ namespace ts {
245241
const previousOnSubstituteNode = context.onSubstituteNode;
246242
context.onSubstituteNode = onSubstituteNode;
247243

244+
let currentSourceFile: SourceFile;
248245
let renamedCatchVariables: Map<boolean>;
249246
let renamedCatchVariableDeclarations: Map<Identifier>;
250247

@@ -297,7 +294,9 @@ namespace ts {
297294

298295
function transformSourceFile(node: SourceFile) {
299296
if (node.transformFlags & TransformFlags.ContainsGenerator) {
300-
return visitEachChild(node, visitor, context);
297+
currentSourceFile = node;
298+
node = visitEachChild(node, visitor, context);
299+
currentSourceFile = undefined;
301300
}
302301

303302
return node;
@@ -2550,7 +2549,7 @@ namespace ts {
25502549

25512550
const buildResult = buildStatements();
25522551
return createCall(
2553-
createIdentifier("__generator"),
2552+
createHelperName(currentSourceFile.externalHelpersModuleName, "__generator"),
25542553
/*typeArguments*/ undefined,
25552554
[setNodeEmitFlags(
25562555
createFunctionExpression(

tests/baselines/reference/disallowAsyncModifierInES5.errors.txt

Lines changed: 0 additions & 27 deletions
This file was deleted.

tests/baselines/reference/disallowAsyncModifierInES5.js

Lines changed: 0 additions & 23 deletions
This file was deleted.

tests/baselines/reference/es5-asyncFunction.js

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,51 +18,40 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1818
});
1919
};
2020
var __generator = (this && this.__generator) || function (body) {
21-
var _ = { label: 0, sent: function() { if (sent[0] === 1 /*throw*/) throw sent[1]; return sent[1]; }, trys: [], stack: [] }, sent;
21+
var _ = { label: 0, sent: function() { if (sent[0] === 1) throw sent[1]; return sent[1]; }, trys: [], stack: [] }, sent, f;
2222
function step(op) {
23-
if (_.flag) throw new TypeError("Generator is already executing.");
24-
while (true) {
23+
if (f) throw new TypeError("Generator is already executing.");
24+
while (1) {
2525
if (_.done) switch (op[0]) {
26-
case 0 /*next*/: return { value: void 0, done: true };
27-
case 1 /*throw*/: case 6 /*catch*/: throw op[1];
28-
case 2 /*return*/: return { value: op[1], done: true };
26+
case 0: return { value: void 0, done: true };
27+
case 1: case 6: throw op[1];
28+
case 2: return { value: op[1], done: true };
2929
}
3030
try {
31-
switch (_.flag = true, op[0]) {
32-
case 0 /*next*/: case 1 /*throw*/: sent = op; break;
33-
case 4 /*yield*/: return _.label++, { value: op[1], done: false };
34-
case 7 /*endfinally*/: op = _.stack.pop(), _.trys.pop(); continue;
31+
switch (f = 1, op[0]) {
32+
case 0: case 1: sent = op; break;
33+
case 4: return _.label++, { value: op[1], done: false };
34+
case 7: op = _.stack.pop(), _.trys.pop(); continue;
3535
default:
3636
var r = _.trys.length > 0 && _.trys[_.trys.length - 1];
37-
if (!r && (op[0] === 1 /*throw*/ || op[0] === 6 /*catch*/ || op[0] === 2 /*return*/)) {
38-
_.done = true;
39-
continue;
40-
}
41-
if (op[0] === 3 /*break*/ && (!r || (op[1] > r[0] && op[1] < r[3]))) {
42-
_.label = op[1];
43-
}
44-
else if (op[0] === 6 /*catch*/ && r && _.label < r[1]) {
45-
_.label = r[1], sent = op;
46-
}
47-
else if (r && _.label < r[2]) {
48-
_.label = r[2], _.stack.push(op);
49-
}
50-
else {
51-
if (r[2]) _.stack.pop();
52-
_.trys.pop();
53-
continue;
54-
}
37+
if (!r && (op[0] === 6 || op[0] === 2)) { _.done = 1; continue; }
38+
if (op[0] === 3 && (!r || (op[1] > r[0] && op[1] < r[3]))) { _.label = op[1]; break; }
39+
if (op[0] === 6 && _.label < r[1]) { _.label = r[1], sent = op; break; }
40+
if (r && _.label < r[2]) { _.label = r[2], _.stack.push(op); break; }
41+
if (r[2]) { _.stack.pop(); }
42+
_.trys.pop();
43+
continue;
5544
}
5645
op = body(_);
5746
}
58-
catch (e) { op = [6 /*catch*/, e]; }
59-
finally { _.flag = false, sent = void 0; }
47+
catch (e) { op = [6, e]; }
48+
finally { f = 0, sent = void 0; }
6049
}
6150
}
6251
return {
63-
next: function (v) { return step([0 /*next*/, v]); },
64-
"throw": function (v) { return step([1 /*throw*/, v]); },
65-
"return": function (v) { return step([2 /*return*/, v]); }
52+
next: function (v) { return step([0, v]); },
53+
"throw": function (v) { return step([1, v]); },
54+
"return": function (v) { return step([2, v]); }
6655
};
6756
};
6857
function empty() {
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
//// [tests/cases/compiler/es5-importHelpersAsyncFunctions.ts] ////
2+
3+
//// [external.ts]
4+
export async function foo() {
5+
}
6+
7+
//// [script.ts]
8+
async function foo() {
9+
}
10+
11+
//// [tslib.d.ts]
12+
export declare function __extends(d: Function, b: Function): void;
13+
export declare function __assign(t: any, ...sources: any[]): any;
14+
export declare function __decorate(decorators: Function[], target: any, key?: string | symbol, desc?: any): any;
15+
export declare function __param(paramIndex: number, decorator: Function): Function;
16+
export declare function __metadata(metadataKey: any, metadataValue: any): Function;
17+
export declare function __awaiter(thisArg: any, _arguments: any, P: Function, generator: Function): any;
18+
export declare function __generator(body: Function): any;
19+
20+
//// [external.js]
21+
"use strict";
22+
var tslib_1 = require("tslib");
23+
function foo() {
24+
return tslib_1.__awaiter(this, void 0, void 0, function () {
25+
return tslib_1.__generator(function (_a) {
26+
return [2 /*return*/];
27+
});
28+
});
29+
}
30+
exports.foo = foo;
31+
//// [script.js]
32+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
33+
return new (P || (P = Promise))(function (resolve, reject) {
34+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
35+
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
36+
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
37+
step((generator = generator.apply(thisArg, _arguments)).next());
38+
});
39+
};
40+
var __generator = (this && this.__generator) || function (body) {
41+
var _ = { label: 0, sent: function() { if (sent[0] === 1) throw sent[1]; return sent[1]; }, trys: [], stack: [] }, sent, f;
42+
function step(op) {
43+
if (f) throw new TypeError("Generator is already executing.");
44+
while (1) {
45+
if (_.done) switch (op[0]) {
46+
case 0: return { value: void 0, done: true };
47+
case 1: case 6: throw op[1];
48+
case 2: return { value: op[1], done: true };
49+
}
50+
try {
51+
switch (f = 1, op[0]) {
52+
case 0: case 1: sent = op; break;
53+
case 4: return _.label++, { value: op[1], done: false };
54+
case 7: op = _.stack.pop(), _.trys.pop(); continue;
55+
default:
56+
var r = _.trys.length > 0 && _.trys[_.trys.length - 1];
57+
if (!r && (op[0] === 6 || op[0] === 2)) { _.done = 1; continue; }
58+
if (op[0] === 3 && (!r || (op[1] > r[0] && op[1] < r[3]))) { _.label = op[1]; break; }
59+
if (op[0] === 6 && _.label < r[1]) { _.label = r[1], sent = op; break; }
60+
if (r && _.label < r[2]) { _.label = r[2], _.stack.push(op); break; }
61+
if (r[2]) { _.stack.pop(); }
62+
_.trys.pop();
63+
continue;
64+
}
65+
op = body(_);
66+
}
67+
catch (e) { op = [6, e]; }
68+
finally { f = 0, sent = void 0; }
69+
}
70+
}
71+
return {
72+
next: function (v) { return step([0, v]); },
73+
"throw": function (v) { return step([1, v]); },
74+
"return": function (v) { return step([2, v]); }
75+
};
76+
};
77+
function foo() {
78+
return __awaiter(this, void 0, void 0, function () {
79+
return __generator(function (_a) {
80+
return [2 /*return*/];
81+
});
82+
});
83+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
=== tests/cases/compiler/external.ts ===
2+
export async function foo() {
3+
>foo : Symbol(foo, Decl(external.ts, 0, 0))
4+
}
5+
6+
=== tests/cases/compiler/script.ts ===
7+
async function foo() {
8+
>foo : Symbol(foo, Decl(script.ts, 0, 0))
9+
}
10+
11+
=== tests/cases/compiler/tslib.d.ts ===
12+
export declare function __extends(d: Function, b: Function): void;
13+
>__extends : Symbol(__extends, Decl(tslib.d.ts, --, --))
14+
>d : Symbol(d, Decl(tslib.d.ts, --, --))
15+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
16+
>b : Symbol(b, Decl(tslib.d.ts, --, --))
17+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
18+
19+
export declare function __assign(t: any, ...sources: any[]): any;
20+
>__assign : Symbol(__assign, Decl(tslib.d.ts, --, --))
21+
>t : Symbol(t, Decl(tslib.d.ts, --, --))
22+
>sources : Symbol(sources, Decl(tslib.d.ts, --, --))
23+
24+
export declare function __decorate(decorators: Function[], target: any, key?: string | symbol, desc?: any): any;
25+
>__decorate : Symbol(__decorate, Decl(tslib.d.ts, --, --))
26+
>decorators : Symbol(decorators, Decl(tslib.d.ts, --, --))
27+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
28+
>target : Symbol(target, Decl(tslib.d.ts, --, --))
29+
>key : Symbol(key, Decl(tslib.d.ts, --, --))
30+
>desc : Symbol(desc, Decl(tslib.d.ts, --, --))
31+
32+
export declare function __param(paramIndex: number, decorator: Function): Function;
33+
>__param : Symbol(__param, Decl(tslib.d.ts, --, --))
34+
>paramIndex : Symbol(paramIndex, Decl(tslib.d.ts, --, --))
35+
>decorator : Symbol(decorator, Decl(tslib.d.ts, --, --))
36+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
37+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
38+
39+
export declare function __metadata(metadataKey: any, metadataValue: any): Function;
40+
>__metadata : Symbol(__metadata, Decl(tslib.d.ts, --, --))
41+
>metadataKey : Symbol(metadataKey, Decl(tslib.d.ts, --, --))
42+
>metadataValue : Symbol(metadataValue, Decl(tslib.d.ts, --, --))
43+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
44+
45+
export declare function __awaiter(thisArg: any, _arguments: any, P: Function, generator: Function): any;
46+
>__awaiter : Symbol(__awaiter, Decl(tslib.d.ts, --, --))
47+
>thisArg : Symbol(thisArg, Decl(tslib.d.ts, --, --))
48+
>_arguments : Symbol(_arguments, Decl(tslib.d.ts, --, --))
49+
>P : Symbol(P, Decl(tslib.d.ts, --, --))
50+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
51+
>generator : Symbol(generator, Decl(tslib.d.ts, --, --))
52+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
53+
54+
export declare function __generator(body: Function): any;
55+
>__generator : Symbol(__generator, Decl(tslib.d.ts, --, --))
56+
>body : Symbol(body, Decl(tslib.d.ts, --, --))
57+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
58+

0 commit comments

Comments
 (0)