Skip to content

Commit 207cabe

Browse files
authored
Refactor WithPrecedingStatements type (#1399)
* Refactor WithPrecedingStatements type * Remove symlinking from test
1 parent 96e76ca commit 207cabe

File tree

27 files changed

+165
-149
lines changed

27 files changed

+165
-149
lines changed

src/transformation/utils/preceding-statements.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ export interface WithPrecedingStatements<
1010

1111
export function transformInPrecedingStatementScope<
1212
TReturn extends lua.Statement | lua.Statement[] | lua.Expression | lua.Expression[]
13-
>(context: TransformationContext, transformer: () => TReturn): [lua.Statement[], TReturn] {
13+
>(context: TransformationContext, transformer: () => TReturn): WithPrecedingStatements<TReturn> {
1414
context.pushPrecedingStatements();
1515
const statementOrStatements = transformer();
1616
const precedingStatements = context.popPrecedingStatements();
17-
return [precedingStatements, statementOrStatements];
17+
return { precedingStatements, result: statementOrStatements };
1818
}

src/transformation/visitors/binary-expression/assignments.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ function transformDestructuredAssignmentExpression(
107107
context: TransformationContext,
108108
expression: ts.DestructuringAssignment
109109
) {
110-
let [rightPrecedingStatements, right] = transformInPrecedingStatementScope(context, () =>
111-
context.transformExpression(expression.right)
110+
let { precedingStatements: rightPrecedingStatements, result: right } = transformInPrecedingStatementScope(
111+
context,
112+
() => context.transformExpression(expression.right)
112113
);
113114
context.addPrecedingStatements(rightPrecedingStatements);
114115
if (isMultiReturnCall(context, expression.right)) {
@@ -153,7 +154,7 @@ export function transformAssignmentExpression(
153154
}
154155

155156
if (ts.isPropertyAccessExpression(expression.left) || ts.isElementAccessExpression(expression.left)) {
156-
const [precedingStatements, right] = transformInPrecedingStatementScope(context, () =>
157+
const { precedingStatements, result: right } = transformInPrecedingStatementScope(context, () =>
157158
context.transformExpression(expression.right)
158159
);
159160

@@ -233,7 +234,7 @@ export function transformAssignmentStatement(
233234
const { statements } = transformDestructuredAssignmentExpression(context, expression);
234235
return statements;
235236
} else {
236-
const [precedingStatements, right] = transformInPrecedingStatementScope(context, () =>
237+
const { precedingStatements, result: right } = transformInPrecedingStatementScope(context, () =>
237238
context.transformExpression(expression.right)
238239
);
239240
return transformAssignmentWithRightPrecedingStatements(context, expression.left, right, precedingStatements);

src/transformation/visitors/binary-expression/compound.ts

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,9 @@ function transformCompoundAssignment(
8686
}
8787

8888
const left = cast(context.transformExpression(lhs), lua.isAssignmentLeftHandSideExpression);
89-
const [rightPrecedingStatements, right] = transformInPrecedingStatementScope(context, () =>
90-
context.transformExpression(rhs)
89+
const { precedingStatements: rightPrecedingStatements, result: right } = transformInPrecedingStatementScope(
90+
context,
91+
() => context.transformExpression(rhs)
9192
);
9293

9394
if (lua.isTableIndexExpression(left)) {
@@ -105,7 +106,7 @@ function transformCompoundAssignment(
105106
// ____obj[____index] = ____tmp ${replacementOperator} ${right};
106107
// return ____tmp
107108
const tmpDeclaration = lua.createVariableDeclarationStatement(tmp, accessExpression);
108-
const [precedingStatements, operatorExpression] = transformBinaryOperation(
109+
const { precedingStatements, result: operatorExpression } = transformBinaryOperation(
109110
context,
110111
tmp,
111112
right,
@@ -136,7 +137,7 @@ function transformCompoundAssignment(
136137
// local ____tmp = ____obj[____index] ${replacementOperator} ${right};
137138
// ____obj[____index] = ____tmp;
138139
// return ____tmp
139-
const [precedingStatements, operatorExpression] = transformBinaryOperation(
140+
const { precedingStatements, result: operatorExpression } = transformBinaryOperation(
140141
context,
141142
accessExpression,
142143
right,
@@ -158,7 +159,7 @@ function transformCompoundAssignment(
158159
// return ____tmp
159160
const tmpIdentifier = context.createTempNameForLuaExpression(left);
160161
const tmpDeclaration = lua.createVariableDeclarationStatement(tmpIdentifier, left);
161-
const [precedingStatements, operatorExpression] = transformBinaryOperation(
162+
const { precedingStatements, result: operatorExpression } = transformBinaryOperation(
162163
context,
163164
tmpIdentifier,
164165
right,
@@ -191,7 +192,7 @@ function transformCompoundAssignment(
191192

192193
// Simple expressions
193194
// ${left} = ${left} ${operator} ${right}
194-
const [precedingStatements, operatorExpression] = transformBinaryOperation(
195+
const { precedingStatements, result: operatorExpression } = transformBinaryOperation(
195196
context,
196197
left,
197198
right,
@@ -250,8 +251,9 @@ export function transformCompoundAssignmentStatement(
250251
}
251252

252253
const left = cast(context.transformExpression(lhs), lua.isAssignmentLeftHandSideExpression);
253-
let [rightPrecedingStatements, right] = transformInPrecedingStatementScope(context, () =>
254-
context.transformExpression(rhs)
254+
const { precedingStatements: rightPrecedingStatements, result: right } = transformInPrecedingStatementScope(
255+
context,
256+
() => context.transformExpression(rhs)
255257
);
256258

257259
if (lua.isTableIndexExpression(left) && shouldCacheTableIndexExpressions(left, rightPrecedingStatements)) {
@@ -277,8 +279,7 @@ export function transformCompoundAssignmentStatement(
277279
];
278280
}
279281

280-
let operatorExpression: lua.Expression;
281-
[rightPrecedingStatements, operatorExpression] = transformBinaryOperation(
282+
const { precedingStatements: rightPrecedingStatements2, result: operatorExpression } = transformBinaryOperation(
282283
context,
283284
accessExpression,
284285
right,
@@ -287,16 +288,15 @@ export function transformCompoundAssignmentStatement(
287288
node
288289
);
289290
const assignStatement = lua.createAssignmentStatement(accessExpression, operatorExpression);
290-
return [objAndIndexDeclaration, ...rightPrecedingStatements, assignStatement];
291+
return [objAndIndexDeclaration, ...rightPrecedingStatements2, assignStatement];
291292
} else {
292293
if (isSetterSkippingCompoundAssignmentOperator(operator)) {
293294
return transformSetterSkippingCompoundAssignment(left, operator, right, rightPrecedingStatements, node);
294295
}
295296

296297
// Simple statements
297298
// ${left} = ${left} ${replacementOperator} ${right}
298-
let operatorExpression: lua.Expression;
299-
[rightPrecedingStatements, operatorExpression] = transformBinaryOperation(
299+
const { precedingStatements: rightPrecedingStatements2, result: operatorExpression } = transformBinaryOperation(
300300
context,
301301
left,
302302
right,
@@ -308,7 +308,7 @@ export function transformCompoundAssignmentStatement(
308308
context,
309309
lhs,
310310
operatorExpression,
311-
rightPrecedingStatements
311+
rightPrecedingStatements2
312312
);
313313
}
314314
}
@@ -368,12 +368,13 @@ function transformCompoundLengthSetter(
368368
rhs: ts.Expression,
369369
operator: CompoundAssignmentToken
370370
): WithPrecedingStatements<lua.ExpressionStatement> {
371-
const [rightPrecedingStatements, right] = transformInPrecedingStatementScope(context, () =>
372-
context.transformExpression(rhs)
371+
const { precedingStatements: rightPrecedingStatements, result: right } = transformInPrecedingStatementScope(
372+
context,
373+
() => context.transformExpression(rhs)
373374
);
374375
const table = context.transformExpression(lhs.expression);
375376
const lengthExpression = lua.createUnaryExpression(table, lua.SyntaxKind.LengthOperator, lhs);
376-
const [precedingStatements, operatorExpression] = transformBinaryOperation(
377+
const { precedingStatements, result: operatorExpression } = transformBinaryOperation(
377378
context,
378379
lengthExpression,
379380
right,

src/transformation/visitors/binary-expression/destructuring-assignments.ts

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,14 @@ function transformArrayLiteralAssignmentPattern(
9797
lua.SyntaxKind.EqualityOperator
9898
);
9999

100-
const [defaultPrecedingStatements, defaultAssignmentStatements] = transformInPrecedingStatementScope(
101-
context,
102-
() =>
100+
const { precedingStatements: defaultPrecedingStatements, result: defaultAssignmentStatements } =
101+
transformInPrecedingStatementScope(context, () =>
103102
transformAssignment(
104103
context,
105104
(element as ts.BinaryExpression).left,
106105
context.transformExpression((element as ts.BinaryExpression).right)
107106
)
108-
);
107+
);
109108

110109
// Keep preceding statements inside if block
111110
defaultAssignmentStatements.unshift(...defaultPrecedingStatements);
@@ -126,7 +125,7 @@ function transformArrayLiteralAssignmentPattern(
126125
case ts.SyntaxKind.Identifier:
127126
case ts.SyntaxKind.PropertyAccessExpression:
128127
case ts.SyntaxKind.ElementAccessExpression:
129-
const [precedingStatements, statements] = transformInPrecedingStatementScope(context, () =>
128+
const { precedingStatements, result: statements } = transformInPrecedingStatementScope(context, () =>
130129
transformAssignment(context, element, indexedRoot, rightHasPrecedingStatements)
131130
);
132131
return [...precedingStatements, ...statements]; // Keep preceding statements in order
@@ -144,14 +143,15 @@ function transformArrayLiteralAssignmentPattern(
144143
lua.createNumericLiteral(index)
145144
);
146145

147-
const [spreadPrecedingStatements, spreadStatements] = transformInPrecedingStatementScope(context, () =>
148-
transformAssignment(
149-
context,
150-
(element as ts.SpreadElement).expression,
151-
restElements,
152-
rightHasPrecedingStatements
153-
)
154-
);
146+
const { precedingStatements: spreadPrecedingStatements, result: spreadStatements } =
147+
transformInPrecedingStatementScope(context, () =>
148+
transformAssignment(
149+
context,
150+
(element as ts.SpreadElement).expression,
151+
restElements,
152+
rightHasPrecedingStatements
153+
)
154+
);
155155
return [...spreadPrecedingStatements, ...spreadStatements]; // Keep preceding statements in order
156156
case ts.SyntaxKind.OmittedExpression:
157157
return [];
@@ -279,9 +279,8 @@ function transformPropertyAssignment(
279279
const left = cast(context.transformExpression(node.initializer.left), lua.isTableIndexExpression);
280280

281281
const rightExpression = node.initializer.right;
282-
const [defaultPrecedingStatements, defaultExpression] = transformInPrecedingStatementScope(context, () =>
283-
context.transformExpression(rightExpression)
284-
);
282+
const { precedingStatements: defaultPrecedingStatements, result: defaultExpression } =
283+
transformInPrecedingStatementScope(context, () => context.transformExpression(rightExpression));
285284

286285
const tableTemp = context.createTempNameForLuaExpression(left.table);
287286
const indexTemp = context.createTempNameForLuaExpression(left.index);
@@ -292,7 +291,7 @@ function transformPropertyAssignment(
292291
);
293292

294293
// obj[index] = extractingExpression ?? defaultExpression
295-
const [rightPrecedingStatements, rhs] = transformBinaryOperation(
294+
const { precedingStatements: rightPrecedingStatements, result: rhs } = transformBinaryOperation(
296295
context,
297296
extractingExpression,
298297
defaultExpression,

src/transformation/visitors/binary-expression/index.ts

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
} from "./compound";
1717
import { assert } from "../../../utils";
1818
import { transformOrderedExpressions } from "../expression-list";
19-
import { transformInPrecedingStatementScope } from "../../utils/preceding-statements";
19+
import { transformInPrecedingStatementScope, WithPrecedingStatements } from "../../utils/preceding-statements";
2020

2121
type ShortCircuitOperator =
2222
| ts.SyntaxKind.AmpersandAmpersandToken
@@ -100,7 +100,7 @@ export function createShortCircuitBinaryExpressionPrecedingStatements(
100100
rightPrecedingStatements: lua.Statement[],
101101
operator: ShortCircuitOperator,
102102
node?: ts.BinaryExpression
103-
): [lua.Statement[], lua.Expression] {
103+
): WithPrecedingStatements<lua.Expression> {
104104
const conditionIdentifier = context.createTempNameForLuaExpression(lhs);
105105
const assignmentStatement = lua.createVariableDeclarationStatement(conditionIdentifier, lhs, node?.left);
106106

@@ -132,19 +132,19 @@ export function createShortCircuitBinaryExpressionPrecedingStatements(
132132
undefined,
133133
node?.left
134134
);
135-
return [[assignmentStatement, ifStatement], conditionIdentifier];
135+
return { precedingStatements: [assignmentStatement, ifStatement], result: conditionIdentifier };
136136
}
137137

138138
function transformShortCircuitBinaryExpression(
139139
context: TransformationContext,
140140
node: ts.BinaryExpression,
141141
operator: ShortCircuitOperator
142-
): [lua.Statement[], lua.Expression] {
142+
): WithPrecedingStatements<lua.Expression> {
143143
const lhs = context.transformExpression(node.left);
144-
const [rightPrecedingStatements, rhs] = transformInPrecedingStatementScope(context, () =>
144+
const { precedingStatements, result } = transformInPrecedingStatementScope(context, () =>
145145
context.transformExpression(node.right)
146146
);
147-
return transformBinaryOperation(context, lhs, rhs, rightPrecedingStatements, operator, node);
147+
return transformBinaryOperation(context, lhs, result, precedingStatements, operator, node);
148148
}
149149

150150
export function transformBinaryOperation(
@@ -154,7 +154,7 @@ export function transformBinaryOperation(
154154
rightPrecedingStatements: lua.Statement[],
155155
operator: BitOperator | SimpleOperator | ts.SyntaxKind.QuestionQuestionToken,
156156
node: ts.Node
157-
): [lua.Statement[], lua.Expression] {
157+
): WithPrecedingStatements<lua.Expression> {
158158
if (rightPrecedingStatements.length > 0 && isShortCircuitOperator(operator)) {
159159
assert(ts.isBinaryExpression(node));
160160
return createShortCircuitBinaryExpressionPrecedingStatements(
@@ -167,10 +167,10 @@ export function transformBinaryOperation(
167167
);
168168
}
169169

170-
return [
171-
rightPrecedingStatements,
172-
transformBinaryOperationWithNoPrecedingStatements(context, left, right, operator, node),
173-
];
170+
return {
171+
precedingStatements: rightPrecedingStatements,
172+
result: transformBinaryOperationWithNoPrecedingStatements(context, left, right, operator, node),
173+
};
174174
}
175175

176176
export const transformBinaryExpression: FunctionVisitor<ts.BinaryExpression> = (node, context) => {
@@ -216,7 +216,7 @@ export const transformBinaryExpression: FunctionVisitor<ts.BinaryExpression> = (
216216

217217
case ts.SyntaxKind.CommaToken: {
218218
const statements = context.transformStatements(ts.factory.createExpressionStatement(node.left));
219-
const [precedingStatements, result] = transformInPrecedingStatementScope(context, () =>
219+
const { precedingStatements, result } = transformInPrecedingStatementScope(context, () =>
220220
context.transformExpression(node.right)
221221
);
222222
statements.push(...precedingStatements);
@@ -227,17 +227,27 @@ export const transformBinaryExpression: FunctionVisitor<ts.BinaryExpression> = (
227227
case ts.SyntaxKind.QuestionQuestionToken:
228228
case ts.SyntaxKind.AmpersandAmpersandToken:
229229
case ts.SyntaxKind.BarBarToken: {
230-
const [precedingStatements, result] = transformShortCircuitBinaryExpression(context, node, operator);
230+
const { precedingStatements, result } = transformShortCircuitBinaryExpression(context, node, operator);
231231
context.addPrecedingStatements(precedingStatements);
232232
return result;
233233
}
234234
}
235235

236-
let [precedingStatements, [lhs, rhs]] = transformInPrecedingStatementScope(context, () =>
236+
const {
237+
precedingStatements: orderedExpressionPrecedingStatements,
238+
result: [lhs, rhs],
239+
} = transformInPrecedingStatementScope(context, () =>
237240
transformOrderedExpressions(context, [node.left, node.right])
238241
);
239-
let result: lua.Expression;
240-
[precedingStatements, result] = transformBinaryOperation(context, lhs, rhs, precedingStatements, operator, node);
242+
243+
const { precedingStatements, result } = transformBinaryOperation(
244+
context,
245+
lhs,
246+
rhs,
247+
orderedExpressionPrecedingStatements,
248+
operator,
249+
node
250+
);
241251
context.addPrecedingStatements(precedingStatements);
242252
return result;
243253
};
@@ -277,7 +287,7 @@ function transformNullishCoalescingOperationNoPrecedingStatements(
277287
// Check if we can take a shortcut to 'lhs or rhs' if the left-hand side cannot be 'false'.
278288
if (canBeFalsyWhenNotNull(context, lhsType)) {
279289
// reuse logic from case with preceding statements
280-
const [precedingStatements, result] = createShortCircuitBinaryExpressionPrecedingStatements(
290+
const { precedingStatements, result } = createShortCircuitBinaryExpressionPrecedingStatements(
281291
context,
282292
transformedLeft,
283293
transformedRight,

src/transformation/visitors/call.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,8 @@ export function transformCallAndArguments(
8080
signature?: ts.Signature,
8181
callContext?: ts.Expression
8282
): [lua.Expression, lua.Expression[]] {
83-
const [argPrecedingStatements, transformedArguments] = transformInPrecedingStatementScope(context, () =>
84-
transformArguments(context, params, signature, callContext)
85-
);
83+
const { precedingStatements: argPrecedingStatements, result: transformedArguments } =
84+
transformInPrecedingStatementScope(context, () => transformArguments(context, params, signature, callContext));
8685
return transformCallWithArguments(context, callExpression, transformedArguments, argPrecedingStatements);
8786
}
8887

@@ -125,9 +124,8 @@ export function transformContextualCallExpression(
125124
}
126125
const left = ts.isCallExpression(node) ? getCalledExpression(node) : node.tag;
127126

128-
let [argPrecedingStatements, transformedArguments] = transformInPrecedingStatementScope(context, () =>
129-
transformArguments(context, args, signature)
130-
);
127+
let { precedingStatements: argPrecedingStatements, result: transformedArguments } =
128+
transformInPrecedingStatementScope(context, () => transformArguments(context, args, signature));
131129

132130
if (
133131
ts.isPropertyAccessExpression(left) &&

src/transformation/visitors/class/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export const transformClassDeclaration: FunctionVisitor<ts.ClassLikeDeclaration>
2929
// If declaration is a default export, transform to export variable assignment instead
3030
if (hasDefaultExportModifier(declaration)) {
3131
// Class declaration including assignment to ____exports.default are in preceding statements
32-
const [precedingStatements] = transformInPrecedingStatementScope(context, () => {
32+
const { precedingStatements } = transformInPrecedingStatementScope(context, () => {
3333
transformClassAsExpression(declaration, context);
3434
return [];
3535
});

src/transformation/visitors/class/members/fields.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export function transformClassInstanceFields(
3333
const statements: lua.Statement[] = [];
3434

3535
for (const f of instanceFields) {
36-
const [precedingStatements, statement] = transformInPrecedingStatementScope(context, () => {
36+
const { precedingStatements, result: statement } = transformInPrecedingStatementScope(context, () => {
3737
// Get identifier
3838
const fieldName = transformPropertyName(context, f.name);
3939

0 commit comments

Comments
 (0)