@@ -40,35 +40,44 @@ const transformAsyncTry: FunctionVisitor<ts.TryStatement> = (statement, context)
4040 let catchScope : Scope | undefined ;
4141 const chainCalls : lua . Statement [ ] = [ ] ;
4242
43- if ( statement . finallyBlock ) {
44- const awaiterFinally = lua . createTableIndexExpression ( awaiterIdentifier , lua . createStringLiteral ( "finally" ) ) ;
45- const finallyFunction = lua . createFunctionExpression (
46- lua . createBlock ( context . transformStatements ( statement . finallyBlock . statements ) )
47- ) ;
48- const finallyCall = lua . createCallExpression (
49- awaiterFinally ,
50- [ awaiterIdentifier , finallyFunction ] ,
51- statement . finallyBlock
52- ) ;
53- chainCalls . push ( lua . createExpressionStatement ( finallyCall ) ) ;
54- }
55-
5643 if ( statement . catchClause ) {
44+ // ____try = ____try.catch(<catch function>)
5745 const [ catchFunction , cScope ] = transformCatchClause ( context , statement . catchClause ) ;
5846 catchScope = cScope ;
5947 if ( catchFunction . params ) {
6048 catchFunction . params . unshift ( lua . createAnonymousIdentifier ( ) ) ;
6149 }
6250
51+ const catchBodyStatements = catchFunction . body ? catchFunction . body . statements : [ ] ;
52+ const asyncWrappedCatch = wrapInAsyncAwaiter ( context , [ ...catchBodyStatements ] , false ) ;
53+ catchFunction . body = lua . createBlock ( [ lua . createReturnStatement ( [ asyncWrappedCatch ] ) ] ) ;
54+
6355 const awaiterCatch = lua . createTableIndexExpression ( awaiterIdentifier , lua . createStringLiteral ( "catch" ) ) ;
6456 const catchCall = lua . createCallExpression ( awaiterCatch , [ awaiterIdentifier , catchFunction ] ) ;
65- const promiseAwait = transformLuaLibFunction ( context , LuaLibFeature . Await , statement , catchCall ) ;
66- chainCalls . push ( lua . createExpressionStatement ( promiseAwait , statement ) ) ;
67- } else {
68- const promiseAwait = transformLuaLibFunction ( context , LuaLibFeature . Await , statement , awaiterIdentifier ) ;
69- chainCalls . push ( lua . createExpressionStatement ( promiseAwait , statement ) ) ;
57+ chainCalls . push ( lua . createAssignmentStatement ( lua . cloneIdentifier ( awaiterIdentifier ) , catchCall ) ) ;
7058 }
7159
60+ if ( statement . finallyBlock ) {
61+ // ____try = ____try.finally(<finally function>)
62+ const finallyStatements = context . transformStatements ( statement . finallyBlock . statements ) ;
63+ const asyncWrappedFinally = wrapInAsyncAwaiter ( context , finallyStatements , false ) ;
64+ const finallyFunction = lua . createFunctionExpression (
65+ lua . createBlock ( [ lua . createReturnStatement ( [ asyncWrappedFinally ] ) ] )
66+ ) ;
67+
68+ const awaiterFinally = lua . createTableIndexExpression ( awaiterIdentifier , lua . createStringLiteral ( "finally" ) ) ;
69+ const finallyCall = lua . createCallExpression (
70+ awaiterFinally ,
71+ [ awaiterIdentifier , finallyFunction ] ,
72+ statement . finallyBlock
73+ ) ;
74+ chainCalls . push ( lua . createAssignmentStatement ( lua . cloneIdentifier ( awaiterIdentifier ) , finallyCall ) ) ;
75+ }
76+
77+ // __TS__Await(____try)
78+ const promiseAwait = transformLuaLibFunction ( context , LuaLibFeature . Await , statement , awaiterIdentifier ) ;
79+ chainCalls . push ( lua . createExpressionStatement ( promiseAwait , statement ) ) ;
80+
7281 const hasReturn = tryScope . asyncTryHasReturn ?? catchScope ?. asyncTryHasReturn ;
7382 const hasBreak = tryScope . asyncTryHasBreak ?? catchScope ?. asyncTryHasBreak ;
7483 const hasContinue = tryScope . asyncTryHasContinue ?? catchScope ?. asyncTryHasContinue ;
0 commit comments