Skip to content

Commit 1a3ff45

Browse files
author
Benjamin Lichtman
committed
Respond to CR
1 parent 830b387 commit 1a3ff45

File tree

4 files changed

+44
-14
lines changed

4 files changed

+44
-14
lines changed

src/services/codefixes/convertToAsyncFunction.ts

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,10 @@ namespace ts.codefix {
1414
getAllCodeActions: context => codeFixAll(context, errorCodes, (changes, err) => convertToAsyncFunction(changes, err.file, err.start, context.program.getTypeChecker(), context)),
1515
});
1616

17-
18-
/*
19-
custom type to encapsulate information for variable declarations synthesized in the refactor
20-
numberOfUsesOriginal - number of times the variable should be assigned in the refactor
21-
numberOfUsesSynthesized - count of how many times the variable has been assigned so far
22-
At the end of the refactor, numberOfUsesOriginal should === numberOfUsesSynthesized
23-
*/
2417
interface SynthIdentifier {
2518
identifier: Identifier;
2619
types: Type[];
27-
numberOfAssignmentsOriginal: number;
20+
numberOfAssignmentsOriginal: number; // number of times the variable should be assigned in the refactor
2821
}
2922

3023
interface SymbolAndIdentifier {
@@ -380,7 +373,7 @@ namespace ts.codefix {
380373
const hasPrevArgName = prevArgName && prevArgName.identifier.text.length > 0;
381374
const originalNodeParent = node.original ? node.original.parent : node.parent;
382375
if (hasPrevArgName && !shouldReturn && (!originalNodeParent || isPropertyAccessExpression(originalNodeParent))) {
383-
return createVariableDeclarationOrAssignment(prevArgName!, createAwait(node), transformer).concat(); // hack to make the types match
376+
return createTransformedStatement(prevArgName!, createAwait(node), transformer).concat(); // hack to make the types match
384377
}
385378
else if (!hasPrevArgName && !shouldReturn && (!originalNodeParent || isPropertyAccessExpression(originalNodeParent))) {
386379
return [createStatement(createAwait(node))];
@@ -389,7 +382,7 @@ namespace ts.codefix {
389382
return [createReturn(getSynthesizedDeepClone(node))];
390383
}
391384

392-
function createVariableDeclarationOrAssignment(prevArgName: SynthIdentifier | undefined, rightHandSide: Expression, transformer: Transformer): NodeArray<Statement> {
385+
function createTransformedStatement(prevArgName: SynthIdentifier | undefined, rightHandSide: Expression, transformer: Transformer): NodeArray<Statement> {
393386
if (!prevArgName || prevArgName.identifier.text.length === 0) {
394387
// if there's no argName to assign to, there still might be side effects
395388
return createNodeArray([createStatement(rightHandSide)]);
@@ -429,7 +422,7 @@ namespace ts.codefix {
429422
break;
430423
}
431424
const returnType = callSignatures[0].getReturnType();
432-
const varDeclOrAssignment = createVariableDeclarationOrAssignment(prevArgName, createAwait(synthCall), transformer);
425+
const varDeclOrAssignment = createTransformedStatement(prevArgName, createAwait(synthCall), transformer);
433426
if (prevArgName) {
434427
prevArgName.types.push(returnType);
435428
}
@@ -471,12 +464,12 @@ namespace ts.codefix {
471464
const type = transformer.checker.getTypeAtLocation(func);
472465
const returnType = getLastCallSignature(type, transformer.checker)!.getReturnType();
473466
const rightHandSide = getSynthesizedDeepClone(funcBody);
474-
const possiblyAwaitedRightHandSide = isPromiseReturningExpression(funcBody, transformer.checker) ? createAwait(rightHandSide) : rightHandSide;
475-
const varDeclOrAssignment = createVariableDeclarationOrAssignment(prevArgName, possiblyAwaitedRightHandSide, transformer);
467+
const possiblyAwaitedRightHandSide = !!transformer.checker.getPromisedTypeOfPromise(returnType) ? createAwait(rightHandSide) : rightHandSide;
468+
const transformedStatement = createTransformedStatement(prevArgName, possiblyAwaitedRightHandSide, transformer);
476469
if (prevArgName) {
477470
prevArgName.types.push(returnType);
478471
}
479-
return varDeclOrAssignment;
472+
return transformedStatement;
480473
}
481474
else {
482475
return createNodeArray([createReturn(getSynthesizedDeepClone(funcBody))]);

src/testRunner/unittests/convertToAsyncFunction.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,11 @@ function [#|f|](): Promise<void> {
414414
_testConvertToAsyncFunction("convertToAsyncFunction_IgnoreArgs2", `
415415
function [#|f|](): Promise<void> {
416416
return fetch('https://typescriptlang.org').then( () => console.log("done") );
417+
}`
418+
);
419+
_testConvertToAsyncFunction("convertToAsyncFunction_IgnoreArgs3", `
420+
function [#|f|](): Promise<void> {
421+
return fetch('https://typescriptlang.org').then( () => console.log("almost done") ).then( () => console.log("done") );
417422
}`
418423
);
419424
_testConvertToAsyncFunction("convertToAsyncFunction_Method", `
@@ -1216,6 +1221,12 @@ function [#|f|]() {
12161221
}
12171222
`);
12181223

1224+
1225+
_testConvertToAsyncFunction("convertToAsyncFunction_nestedPromises", `
1226+
function [#|f|]() {
1227+
return fetch('https://typescriptlang.org').then(x => Promise.resolve(3).then(y => Promise.resolve(x.statusText.length + y)));
1228+
}
1229+
`);
12191230
});
12201231

12211232
function _testConvertToAsyncFunction(caption: string, text: string) {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// ==ORIGINAL==
2+
3+
function /*[#|*/f/*|]*/() {
4+
return fetch('https://typescriptlang.org').then(x => Promise.resolve(3).then(y => Promise.resolve(x.statusText.length + y)));
5+
}
6+
7+
// ==ASYNC FUNCTION::Convert to async function==
8+
9+
async function f() {
10+
const x = await fetch('https://typescriptlang.org');
11+
const y = await Promise.resolve(3);
12+
return Promise.resolve(x.statusText.length + y);
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// ==ORIGINAL==
2+
3+
function /*[#|*/f/*|]*/() {
4+
return fetch('https://typescriptlang.org').then(x => Promise.resolve(3).then(y => Promise.resolve(x.statusText.length + y)));
5+
}
6+
7+
// ==ASYNC FUNCTION::Convert to async function==
8+
9+
async function f() {
10+
const x = await fetch('https://typescriptlang.org');
11+
const y = await Promise.resolve(3);
12+
return Promise.resolve(x.statusText.length + y);
13+
}

0 commit comments

Comments
 (0)