Skip to content

Commit 4e4892a

Browse files
authored
Merge pull request #12817 from Microsoft/improveAsyncStepping
Improve async stepping
2 parents 94b10f8 + b195ef8 commit 4e4892a

21 files changed

+187
-225
lines changed

src/compiler/emitter.ts

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,28 +1305,28 @@ namespace ts {
13051305
writeToken(SyntaxKind.OpenParenToken, openParenPos, node);
13061306
emitExpression(node.expression);
13071307
writeToken(SyntaxKind.CloseParenToken, node.expression.end, node);
1308-
emitEmbeddedStatement(node.thenStatement);
1308+
emitEmbeddedStatement(node, node.thenStatement);
13091309
if (node.elseStatement) {
1310-
writeLine();
1310+
writeLineOrSpace(node);
13111311
writeToken(SyntaxKind.ElseKeyword, node.thenStatement.end, node);
13121312
if (node.elseStatement.kind === SyntaxKind.IfStatement) {
13131313
write(" ");
13141314
emit(node.elseStatement);
13151315
}
13161316
else {
1317-
emitEmbeddedStatement(node.elseStatement);
1317+
emitEmbeddedStatement(node, node.elseStatement);
13181318
}
13191319
}
13201320
}
13211321

13221322
function emitDoStatement(node: DoStatement) {
13231323
write("do");
1324-
emitEmbeddedStatement(node.statement);
1324+
emitEmbeddedStatement(node, node.statement);
13251325
if (isBlock(node.statement)) {
13261326
write(" ");
13271327
}
13281328
else {
1329-
writeLine();
1329+
writeLineOrSpace(node);
13301330
}
13311331

13321332
write("while (");
@@ -1338,7 +1338,7 @@ namespace ts {
13381338
write("while (");
13391339
emitExpression(node.expression);
13401340
write(")");
1341-
emitEmbeddedStatement(node.statement);
1341+
emitEmbeddedStatement(node, node.statement);
13421342
}
13431343

13441344
function emitForStatement(node: ForStatement) {
@@ -1351,7 +1351,7 @@ namespace ts {
13511351
write(";");
13521352
emitExpressionWithPrefix(" ", node.incrementor);
13531353
write(")");
1354-
emitEmbeddedStatement(node.statement);
1354+
emitEmbeddedStatement(node, node.statement);
13551355
}
13561356

13571357
function emitForInStatement(node: ForInStatement) {
@@ -1362,7 +1362,7 @@ namespace ts {
13621362
write(" in ");
13631363
emitExpression(node.expression);
13641364
writeToken(SyntaxKind.CloseParenToken, node.expression.end);
1365-
emitEmbeddedStatement(node.statement);
1365+
emitEmbeddedStatement(node, node.statement);
13661366
}
13671367

13681368
function emitForOfStatement(node: ForOfStatement) {
@@ -1373,7 +1373,7 @@ namespace ts {
13731373
write(" of ");
13741374
emitExpression(node.expression);
13751375
writeToken(SyntaxKind.CloseParenToken, node.expression.end);
1376-
emitEmbeddedStatement(node.statement);
1376+
emitEmbeddedStatement(node, node.statement);
13771377
}
13781378

13791379
function emitForBinding(node: VariableDeclarationList | Expression) {
@@ -1409,7 +1409,7 @@ namespace ts {
14091409
write("with (");
14101410
emitExpression(node.expression);
14111411
write(")");
1412-
emitEmbeddedStatement(node.statement);
1412+
emitEmbeddedStatement(node, node.statement);
14131413
}
14141414

14151415
function emitSwitchStatement(node: SwitchStatement) {
@@ -1437,9 +1437,12 @@ namespace ts {
14371437
function emitTryStatement(node: TryStatement) {
14381438
write("try ");
14391439
emit(node.tryBlock);
1440-
emit(node.catchClause);
1440+
if (node.catchClause) {
1441+
writeLineOrSpace(node);
1442+
emit(node.catchClause);
1443+
}
14411444
if (node.finallyBlock) {
1442-
writeLine();
1445+
writeLineOrSpace(node);
14431446
write("finally ");
14441447
emit(node.finallyBlock);
14451448
}
@@ -2125,8 +2128,8 @@ namespace ts {
21252128
}
21262129
}
21272130

2128-
function emitEmbeddedStatement(node: Statement) {
2129-
if (isBlock(node)) {
2131+
function emitEmbeddedStatement(parent: Node, node: Statement) {
2132+
if (isBlock(node) || getEmitFlags(parent) & EmitFlags.SingleLine) {
21302133
write(" ");
21312134
emit(node);
21322135
}
@@ -2291,6 +2294,15 @@ namespace ts {
22912294
}
22922295
}
22932296

2297+
function writeLineOrSpace(node: Node) {
2298+
if (getEmitFlags(node) & EmitFlags.SingleLine) {
2299+
write(" ");
2300+
}
2301+
else {
2302+
writeLine();
2303+
}
2304+
}
2305+
22942306
function writeIfAny(nodes: NodeArray<Node>, text: string) {
22952307
if (nodes && nodes.length > 0) {
22962308
write(text);

src/compiler/transformers/generators.ts

Lines changed: 70 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -938,7 +938,7 @@ namespace ts {
938938
}
939939

940940
markLabel(resumeLabel);
941-
return createGeneratorResume();
941+
return createGeneratorResume(/*location*/ node);
942942
}
943943

944944
/**
@@ -1234,7 +1234,9 @@ namespace ts {
12341234

12351235
function transformAndEmitVariableDeclarationList(node: VariableDeclarationList): VariableDeclarationList {
12361236
for (const variable of node.declarations) {
1237-
hoistVariableDeclaration(<Identifier>variable.name);
1237+
const name = getSynthesizedClone(<Identifier>variable.name);
1238+
setCommentRange(name, variable.name);
1239+
hoistVariableDeclaration(name);
12381240
}
12391241

12401242
const variables = getInitializedVariables(node);
@@ -1287,7 +1289,7 @@ namespace ts {
12871289
if (containsYield(node.thenStatement) || containsYield(node.elseStatement)) {
12881290
const endLabel = defineLabel();
12891291
const elseLabel = node.elseStatement ? defineLabel() : undefined;
1290-
emitBreakWhenFalse(node.elseStatement ? elseLabel : endLabel, visitNode(node.expression, visitor, isExpression));
1292+
emitBreakWhenFalse(node.elseStatement ? elseLabel : endLabel, visitNode(node.expression, visitor, isExpression), /*location*/ node.expression);
12911293
transformAndEmitEmbeddedStatement(node.thenStatement);
12921294
if (node.elseStatement) {
12931295
emitBreak(endLabel);
@@ -2965,12 +2967,15 @@ namespace ts {
29652967
lastOperationWasAbrupt = true;
29662968
lastOperationWasCompletion = true;
29672969
writeStatement(
2968-
createReturn(
2969-
createArrayLiteral(expression
2970-
? [createInstruction(Instruction.Return), expression]
2971-
: [createInstruction(Instruction.Return)]
2970+
setEmitFlags(
2971+
createReturn(
2972+
createArrayLiteral(expression
2973+
? [createInstruction(Instruction.Return), expression]
2974+
: [createInstruction(Instruction.Return)]
2975+
),
2976+
operationLocation
29722977
),
2973-
operationLocation
2978+
EmitFlags.NoTokenSourceMaps
29742979
)
29752980
);
29762981
}
@@ -2984,12 +2989,15 @@ namespace ts {
29842989
function writeBreak(label: Label, operationLocation: TextRange): void {
29852990
lastOperationWasAbrupt = true;
29862991
writeStatement(
2987-
createReturn(
2988-
createArrayLiteral([
2989-
createInstruction(Instruction.Break),
2990-
createLabel(label)
2991-
]),
2992-
operationLocation
2992+
setEmitFlags(
2993+
createReturn(
2994+
createArrayLiteral([
2995+
createInstruction(Instruction.Break),
2996+
createLabel(label)
2997+
]),
2998+
operationLocation
2999+
),
3000+
EmitFlags.NoTokenSourceMaps
29933001
)
29943002
);
29953003
}
@@ -3003,15 +3011,21 @@ namespace ts {
30033011
*/
30043012
function writeBreakWhenTrue(label: Label, condition: Expression, operationLocation: TextRange): void {
30053013
writeStatement(
3006-
createIf(
3007-
condition,
3008-
createReturn(
3009-
createArrayLiteral([
3010-
createInstruction(Instruction.Break),
3011-
createLabel(label)
3012-
]),
3013-
operationLocation
3014-
)
3014+
setEmitFlags(
3015+
createIf(
3016+
condition,
3017+
setEmitFlags(
3018+
createReturn(
3019+
createArrayLiteral([
3020+
createInstruction(Instruction.Break),
3021+
createLabel(label)
3022+
]),
3023+
operationLocation
3024+
),
3025+
EmitFlags.NoTokenSourceMaps
3026+
)
3027+
),
3028+
EmitFlags.SingleLine
30153029
)
30163030
);
30173031
}
@@ -3025,15 +3039,21 @@ namespace ts {
30253039
*/
30263040
function writeBreakWhenFalse(label: Label, condition: Expression, operationLocation: TextRange): void {
30273041
writeStatement(
3028-
createIf(
3029-
createLogicalNot(condition),
3030-
createReturn(
3031-
createArrayLiteral([
3032-
createInstruction(Instruction.Break),
3033-
createLabel(label)
3034-
]),
3035-
operationLocation
3036-
)
3042+
setEmitFlags(
3043+
createIf(
3044+
createLogicalNot(condition),
3045+
setEmitFlags(
3046+
createReturn(
3047+
createArrayLiteral([
3048+
createInstruction(Instruction.Break),
3049+
createLabel(label)
3050+
]),
3051+
operationLocation
3052+
),
3053+
EmitFlags.NoTokenSourceMaps
3054+
)
3055+
),
3056+
EmitFlags.SingleLine
30373057
)
30383058
);
30393059
}
@@ -3047,13 +3067,16 @@ namespace ts {
30473067
function writeYield(expression: Expression, operationLocation: TextRange): void {
30483068
lastOperationWasAbrupt = true;
30493069
writeStatement(
3050-
createReturn(
3051-
createArrayLiteral(
3052-
expression
3053-
? [createInstruction(Instruction.Yield), expression]
3054-
: [createInstruction(Instruction.Yield)]
3070+
setEmitFlags(
3071+
createReturn(
3072+
createArrayLiteral(
3073+
expression
3074+
? [createInstruction(Instruction.Yield), expression]
3075+
: [createInstruction(Instruction.Yield)]
3076+
),
3077+
operationLocation
30553078
),
3056-
operationLocation
3079+
EmitFlags.NoTokenSourceMaps
30573080
)
30583081
);
30593082
}
@@ -3067,12 +3090,15 @@ namespace ts {
30673090
function writeYieldStar(expression: Expression, operationLocation: TextRange): void {
30683091
lastOperationWasAbrupt = true;
30693092
writeStatement(
3070-
createReturn(
3071-
createArrayLiteral([
3072-
createInstruction(Instruction.YieldStar),
3073-
expression
3074-
]),
3075-
operationLocation
3093+
setEmitFlags(
3094+
createReturn(
3095+
createArrayLiteral([
3096+
createInstruction(Instruction.YieldStar),
3097+
expression
3098+
]),
3099+
operationLocation
3100+
),
3101+
EmitFlags.NoTokenSourceMaps
30763102
)
30773103
);
30783104
}

tests/baselines/reference/asyncAwaitWithCapturedBlockScopeVar.js

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ function fn1() {
5757
i = 0;
5858
_a.label = 1;
5959
case 1:
60-
if (!(i < 1))
61-
return [3 /*break*/, 4];
60+
if (!(i < 1)) return [3 /*break*/, 4];
6261
return [5 /*yield**/, _loop_1(i)];
6362
case 2:
6463
_a.sent();
@@ -92,8 +91,7 @@ function fn2() {
9291
i = 0;
9392
_a.label = 1;
9493
case 1:
95-
if (!(i < 1))
96-
return [3 /*break*/, 4];
94+
if (!(i < 1)) return [3 /*break*/, 4];
9795
return [5 /*yield**/, _loop_2(i)];
9896
case 2:
9997
state_1 = _a.sent();
@@ -129,8 +127,7 @@ function fn3() {
129127
i = 0;
130128
_a.label = 1;
131129
case 1:
132-
if (!(i < 1))
133-
return [3 /*break*/, 4];
130+
if (!(i < 1)) return [3 /*break*/, 4];
134131
return [5 /*yield**/, _loop_3(i)];
135132
case 2:
136133
_a.sent();
@@ -164,8 +161,7 @@ function fn4() {
164161
i = 0;
165162
_a.label = 1;
166163
case 1:
167-
if (!(i < 1))
168-
return [3 /*break*/, 4];
164+
if (!(i < 1)) return [3 /*break*/, 4];
169165
return [5 /*yield**/, _loop_4(i)];
170166
case 2:
171167
state_2 = _a.sent();

tests/baselines/reference/es5-asyncFunctionBinaryExpressions.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,7 @@ function binaryLogicalAnd1() {
169169
switch (_b.label) {
170170
case 0:
171171
_a = x;
172-
if (!_a)
173-
return [3 /*break*/, 2];
172+
if (!_a) return [3 /*break*/, 2];
174173
return [4 /*yield*/, y];
175174
case 1:
176175
_a = (_b.sent());

tests/baselines/reference/es5-asyncFunctionConditionals.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ function conditional1() {
3232
return __generator(this, function (_b) {
3333
switch (_b.label) {
3434
case 0:
35-
if (!x)
36-
return [3 /*break*/, 2];
35+
if (!x) return [3 /*break*/, 2];
3736
return [4 /*yield*/, y];
3837
case 1:
3938
_a = _b.sent();
@@ -54,8 +53,7 @@ function conditional2() {
5453
return __generator(this, function (_b) {
5554
switch (_b.label) {
5655
case 0:
57-
if (!x)
58-
return [3 /*break*/, 1];
56+
if (!x) return [3 /*break*/, 1];
5957
_a = y;
6058
return [3 /*break*/, 3];
6159
case 1: return [4 /*yield*/, z];

0 commit comments

Comments
 (0)