@@ -9,8 +9,13 @@ import { transformArguments } from "../call";
99import { getDependenciesOfSymbol , createExportedIdentifier } from "../../utils/export" ;
1010import { createLocalOrExportedOrGlobalDeclaration } from "../../utils/lua-ast" ;
1111import {
12- invalidMultiHelperFunctionUse ,
12+ invalidMultiReturnArrayBindingPatternElementInitializer ,
13+ invalidMultiReturnArrayLiteralElementInitializer ,
14+ invalidMultiReturnToEmptyPatternOrArrayLiteral ,
15+ invalidMultiReturnToNonArrayBindingPattern ,
16+ invalidMultiReturnToNonArrayLiteral ,
1317 unsupportedMultiFunctionAssignment ,
18+ unsupportedMultiHelperFunctionPosition ,
1419} from "../../../transformation/utils/diagnostics" ;
1520
1621const isMultiHelperDeclaration = ( context : TransformationContext ) => ( declaration : ts . Declaration ) : boolean => {
@@ -52,11 +57,15 @@ function transformMultiHelperCallArguments(
5257 context : TransformationContext ,
5358 expression : ts . CallExpression
5459) : lua . Expression [ ] | lua . Expression {
55- return isMultiHelperCallSignature ( context , expression )
56- ? expression . arguments . length > 0
57- ? expression . arguments . map ( e => context . transformExpression ( e ) )
58- : lua . createNilLiteral ( expression )
59- : context . transformExpression ( expression ) ;
60+ if ( ! isMultiHelperCallSignature ( context , expression ) ) {
61+ return context . transformExpression ( expression ) ;
62+ }
63+
64+ if ( expression . arguments . length < 1 ) {
65+ return lua . createNilLiteral ( expression ) ;
66+ }
67+
68+ return expression . arguments . map ( e => context . transformExpression ( e ) ) ;
6069}
6170
6271export function transformMultiHelperVariableDeclaration (
@@ -66,24 +75,41 @@ export function transformMultiHelperVariableDeclaration(
6675 if ( ! declaration . initializer ) return ;
6776 if ( ! isMultiReturnCall ( context , declaration . initializer ) ) return ;
6877
69- if ( ! ts . isArrayBindingPattern ( declaration . name ) || declaration . name . elements . length < 1 ) {
70- context . diagnostics . push ( invalidMultiHelperFunctionUse ( declaration . name ) ) ;
78+ if ( ! ts . isArrayBindingPattern ( declaration . name ) ) {
79+ context . diagnostics . push ( invalidMultiReturnToNonArrayBindingPattern ( declaration . name ) ) ;
7180 return [ ] ;
7281 }
7382
74- const leftIdentifiers = declaration . name . elements
75- . map ( element => {
76- if ( ts . isBindingElement ( element ) && ts . isIdentifier ( element . name ) ) {
77- return transformIdentifier ( context , element . name ) ;
78- }
83+ if ( declaration . name . elements . length < 1 ) {
84+ context . diagnostics . push ( invalidMultiReturnToEmptyPatternOrArrayLiteral ( declaration . name ) ) ;
85+ return [ ] ;
86+ }
87+
88+ const leftIdentifiers : lua . Identifier [ ] = [ ] ;
7989
80- if ( ts . isOmittedExpression ( element ) ) {
81- return lua . createAnonymousIdentifier ( element ) ;
90+ for ( const element of declaration . name . elements ) {
91+ let expression : lua . Identifier | undefined ;
92+
93+ if ( ts . isBindingElement ( element ) && ts . isIdentifier ( element . name ) ) {
94+ if ( element . initializer ) {
95+ context . diagnostics . push ( invalidMultiReturnArrayBindingPatternElementInitializer ( element ) ) ;
96+ continue ;
97+ } else {
98+ expression = transformIdentifier ( context , element . name ) ;
8299 }
100+ }
101+
102+ if ( ts . isOmittedExpression ( element ) ) {
103+ expression = lua . createAnonymousIdentifier ( element ) ;
104+ }
83105
106+ if ( ! expression ) {
84107 context . diagnostics . push ( unsupportedMultiFunctionAssignment ( element ) ) ;
85- } )
86- . filter ( isNonNull ) ;
108+ continue ;
109+ }
110+
111+ leftIdentifiers . push ( expression ) ;
112+ }
87113
88114 const rightExpressions = transformMultiHelperCallArguments ( context , declaration . initializer ) ;
89115 return createLocalOrExportedOrGlobalDeclaration ( context , leftIdentifiers , rightExpressions , declaration ) ;
@@ -97,12 +123,18 @@ export function transformMultiHelperDestructuringAssignmentStatement(
97123 if ( statement . expression . operatorToken . kind !== ts . SyntaxKind . EqualsToken ) return ;
98124 if ( ! isMultiReturnCall ( context , statement . expression . right ) ) return ;
99125
100- if (
101- ! ts . isArrayLiteralExpression ( statement . expression . left ) ||
102- statement . expression . left . elements . length < 1 ||
103- statement . expression . left . elements . some ( ts . isBinaryExpression )
104- ) {
105- context . diagnostics . push ( invalidMultiHelperFunctionUse ( statement . expression . left ) ) ;
126+ if ( ! ts . isArrayLiteralExpression ( statement . expression . left ) ) {
127+ context . diagnostics . push ( invalidMultiReturnToNonArrayLiteral ( statement . expression . left ) ) ;
128+ return [ ] ;
129+ }
130+
131+ if ( statement . expression . left . elements . some ( ts . isBinaryExpression ) ) {
132+ context . diagnostics . push ( invalidMultiReturnArrayLiteralElementInitializer ( statement . expression . left ) ) ;
133+ return [ ] ;
134+ }
135+
136+ if ( statement . expression . left . elements . length < 1 ) {
137+ context . diagnostics . push ( invalidMultiReturnToEmptyPatternOrArrayLiteral ( statement . expression . left ) ) ;
106138 return [ ] ;
107139 }
108140
@@ -141,7 +173,7 @@ export function findMultiHelperAssignmentViolations(
141173 if ( valueSymbol ) {
142174 const declaration = valueSymbol . valueDeclaration ;
143175 if ( declaration && isMultiHelperDeclaration ( context ) ( declaration ) ) {
144- context . diagnostics . push ( invalidMultiHelperFunctionUse ( element ) ) ;
176+ context . diagnostics . push ( unsupportedMultiHelperFunctionPosition ( element ) ) ;
145177 return element ;
146178 }
147179 }
0 commit comments