Skip to content

Commit cb57f17

Browse files
author
Benjamin Lichtman
committed
Simplify approach
1 parent 28e68a6 commit cb57f17

File tree

2 files changed

+17
-18
lines changed

2 files changed

+17
-18
lines changed

src/services/codefixes/convertToAsyncFunction.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ namespace ts.codefix {
6060
const setOfExpressionsToReturn = getAllPromiseExpressionsToReturn(functionToConvert, checker);
6161
const functionToConvertRenamed = renameCollidingVarNames(functionToConvert, checker, synthNamesMap, context, setOfExpressionsToReturn, originalTypeMap, allVarNames);
6262
const constIdentifiers = getConstIdentifiers(synthNamesMap);
63-
const returnStatements = functionToConvertRenamed.body && isBlock(functionToConvertRenamed.body) ? getReturnStatementsWithPromiseHandlers(functionToConvertRenamed.body, checker) : emptyArray;
63+
const returnStatements = functionToConvertRenamed.body && isBlock(functionToConvertRenamed.body) ? getReturnStatementsWithPromiseHandlers(functionToConvertRenamed.body) : emptyArray;
6464
const transformer: Transformer = { checker, synthNamesMap, allVarNames, setOfExpressionsToReturn, constIdentifiers, originalTypeMap, isInJSFile: isInJavascript };
6565

6666
if (!returnStatements.length) {
@@ -87,10 +87,10 @@ namespace ts.codefix {
8787
}
8888
}
8989

90-
function getReturnStatementsWithPromiseHandlers(body: Block, checker: TypeChecker): ReadonlyArray<ReturnStatement> {
90+
function getReturnStatementsWithPromiseHandlers(body: Block): ReadonlyArray<ReturnStatement> {
9191
const res: ReturnStatement[] = [];
9292
forEachReturnStatement(body, ret => {
93-
if (isReturnStatementWithFixablePromiseHandler(ret, checker)) res.push(ret);
93+
if (isReturnStatementWithFixablePromiseHandler(ret)) res.push(ret);
9494
});
9595
return res;
9696
}
@@ -450,7 +450,7 @@ namespace ts.codefix {
450450
seenReturnStatement = true;
451451
}
452452

453-
if (isReturnStatementWithFixablePromiseHandler(statement, transformer.checker)) {
453+
if (isReturnStatementWithFixablePromiseHandler(statement)) {
454454
refactoredStmts = refactoredStmts.concat(getInnerTransformationBody(transformer, [statement], prevArgName));
455455
}
456456
else {
@@ -466,7 +466,7 @@ namespace ts.codefix {
466466
seenReturnStatement);
467467
}
468468
else {
469-
const innerRetStmts = isFixablePromiseHandler(funcBody, transformer.checker) ? [createReturn(funcBody)] : emptyArray;
469+
const innerRetStmts = isFixablePromiseHandler(funcBody) ? [createReturn(funcBody)] : emptyArray;
470470
const innerCbBody = getInnerTransformationBody(transformer, innerRetStmts, prevArgName);
471471

472472
if (innerCbBody.length > 0) {

src/services/suggestionDiagnostics.ts

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ namespace ts {
117117
}
118118

119119
function addConvertToAsyncFunctionDiagnostics(node: FunctionLikeDeclaration, checker: TypeChecker, diags: Push<DiagnosticWithLocation>): void {
120-
if (!visitedNestedConvertibleFunctions.has(getKeyFromNode(node)) && isConvertibleFunction(node, checker)) {
120+
// need to check function before checking map so that deeper levels of nested callbacks are checked
121+
if (isConvertibleFunction(node, checker) && !visitedNestedConvertibleFunctions.has(getKeyFromNode(node))) {
121122
diags.push(createDiagnosticForNode(
122123
!node.name && isVariableDeclaration(node.parent) && isIdentifier(node.parent.name) ? node.parent.name : node,
123124
Diagnostics.This_may_be_converted_to_an_async_function));
@@ -128,7 +129,7 @@ namespace ts {
128129
return !isAsyncFunction(node) &&
129130
node.body &&
130131
isBlock(node.body) &&
131-
hasReturnStatementWithPromiseHandler(node.body, checker) &&
132+
hasReturnStatementWithPromiseHandler(node.body) &&
132133
returnsPromise(node, checker);
133134
}
134135

@@ -143,25 +144,25 @@ namespace ts {
143144
return isBinaryExpression(commonJsModuleIndicator) ? commonJsModuleIndicator.left : commonJsModuleIndicator;
144145
}
145146

146-
function hasReturnStatementWithPromiseHandler(body: Block, checker: TypeChecker): boolean {
147-
return !!forEachReturnStatement(body, stmt => isReturnStatementWithFixablePromiseHandler(stmt, checker));
147+
function hasReturnStatementWithPromiseHandler(body: Block): boolean {
148+
return !!forEachReturnStatement(body, isReturnStatementWithFixablePromiseHandler);
148149
}
149150

150-
export function isReturnStatementWithFixablePromiseHandler(node: Node, checker: TypeChecker): node is ReturnStatement {
151-
return isReturnStatement(node) && !!node.expression && isFixablePromiseHandler(node.expression, checker);
151+
export function isReturnStatementWithFixablePromiseHandler(node: Node): node is ReturnStatement {
152+
return isReturnStatement(node) && !!node.expression && isFixablePromiseHandler(node.expression);
152153
}
153154

154155
// Should be kept up to date with transformExpression in convertToAsyncFunction.ts
155-
export function isFixablePromiseHandler(node: Node, checker: TypeChecker): boolean {
156+
export function isFixablePromiseHandler(node: Node): boolean {
156157
// ensure outermost call exists and is a promise handler
157-
if (!isPromiseHandler(node) || !node.arguments.every((arg) => isFixablePromiseArgument(arg, checker))) {
158+
if (!isPromiseHandler(node) || !node.arguments.every(isFixablePromiseArgument)) {
158159
return false;
159160
}
160161

161162
// ensure all chained calls are valid
162163
let currentNode = node.expression;
163164
while (isPromiseHandler(currentNode) || isPropertyAccessExpression(currentNode)) {
164-
if (isCallExpression(currentNode) && !currentNode.arguments.every(arg => isFixablePromiseArgument(arg, checker))) {
165+
if (isCallExpression(currentNode) && !currentNode.arguments.every(isFixablePromiseArgument)) {
165166
return false;
166167
}
167168
currentNode = currentNode.expression;
@@ -174,14 +175,12 @@ namespace ts {
174175
}
175176

176177
// should be kept up to date with getTransformationBody in convertToAsyncFunction.ts
177-
function isFixablePromiseArgument(arg: Expression, checker: TypeChecker): boolean {
178+
function isFixablePromiseArgument(arg: Expression): boolean {
178179
switch (arg.kind) {
179180
case SyntaxKind.FunctionDeclaration:
180181
case SyntaxKind.FunctionExpression:
181182
case SyntaxKind.ArrowFunction:
182-
if (isConvertibleFunction(arg as FunctionLikeDeclaration, checker)) {
183-
visitedNestedConvertibleFunctions.set(getKeyFromNode(arg as FunctionLikeDeclaration), true);
184-
}
183+
visitedNestedConvertibleFunctions.set(getKeyFromNode(arg as FunctionLikeDeclaration), true);
185184
/* falls through */
186185
case SyntaxKind.NullKeyword:
187186
case SyntaxKind.Identifier: // identifier includes undefined

0 commit comments

Comments
 (0)