@@ -44,31 +44,38 @@ export const transformTryStatement: FunctionVisitor<ts.TryStatement> = (statemen
4444 const catchParameter = statement . catchClause . variableDeclaration
4545 ? transformIdentifier ( context , statement . catchClause . variableDeclaration . name as ts . Identifier )
4646 : undefined ;
47- const catchParameters = ( ) => ( catchParameter ? [ lua . cloneIdentifier ( catchParameter ) ] : [ ] ) ;
48-
47+ const catchFunction = lua . createFunctionExpression (
48+ catchBlock ,
49+ catchParameter ? [ lua . cloneIdentifier ( catchParameter ) ] : [ ]
50+ ) ;
4951 const catchIdentifier = lua . createIdentifier ( "____catch" ) ;
50- const catchFunction = lua . createFunctionExpression ( catchBlock , catchParameters ( ) ) ;
5152 result . push ( lua . createVariableDeclarationStatement ( catchIdentifier , catchFunction ) ) ;
5253
54+ const hasReturn = tryScope . functionReturned ?? catchScope . functionReturned ;
55+
5356 const tryReturnIdentifiers = [ tryResultIdentifier ] ; // ____try
54- if ( returnedIdentifier ) {
55- tryReturnIdentifiers . push ( returnedIdentifier ) ; // ____returned or catch variable
56- if ( tryScope . functionReturned || catchScope . functionReturned ) {
57+ if ( hasReturn || statement . catchClause . variableDeclaration ) {
58+ tryReturnIdentifiers . push ( returnedIdentifier ) ; // ____returned
59+ if ( hasReturn ) {
5760 tryReturnIdentifiers . push ( returnValueIdentifier ) ; // ____returnValue
5861 returnCondition = lua . cloneIdentifier ( returnedIdentifier ) ;
5962 }
6063 }
6164 result . push ( lua . createVariableDeclarationStatement ( tryReturnIdentifiers , tryCall ) ) ;
6265
63- // Wrap catch in function if try or catch has return
64- const catchCall = lua . createCallExpression ( catchIdentifier , [ lua . cloneIdentifier ( returnedIdentifier ) ] ) ;
65- const catchAssign = lua . createAssignmentStatement (
66- [ lua . cloneIdentifier ( returnedIdentifier ) , lua . cloneIdentifier ( returnValueIdentifier ) ] ,
67- catchCall
66+ const catchCall = lua . createCallExpression (
67+ catchIdentifier ,
68+ statement . catchClause . variableDeclaration ? [ lua . cloneIdentifier ( returnedIdentifier ) ] : [ ]
6869 ) ;
70+ const catchCallStatement = hasReturn
71+ ? lua . createAssignmentStatement (
72+ [ lua . cloneIdentifier ( returnedIdentifier ) , lua . cloneIdentifier ( returnValueIdentifier ) ] ,
73+ catchCall
74+ )
75+ : lua . createExpressionStatement ( catchCall ) ;
6976
7077 const notTryCondition = lua . createUnaryExpression ( tryResultIdentifier , lua . SyntaxKind . NotOperator ) ;
71- result . push ( lua . createIfStatement ( notTryCondition , lua . createBlock ( [ catchAssign ] ) ) ) ;
78+ result . push ( lua . createIfStatement ( notTryCondition , lua . createBlock ( [ catchCallStatement ] ) ) ) ;
7279 } else if ( tryScope . functionReturned ) {
7380 // try with return, but no catch
7481 // returnedIdentifier = lua.createIdentifier("____returned");
0 commit comments