Skip to content

Commit a17d9b1

Browse files
authored
Fix cast exception (#1419)
1 parent f802fa5 commit a17d9b1

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import * as ts from "typescript";
22
import * as lua from "../../../LuaAST";
3-
import { cast, assertNever } from "../../../utils";
3+
import { assertNever } from "../../../utils";
44
import { TransformationContext } from "../../context";
55
import { transformInPrecedingStatementScope, WithPrecedingStatements } from "../../utils/preceding-statements";
66
import { transformBinaryOperation } from "./index";
77
import { transformAssignmentWithRightPrecedingStatements } from "./assignments";
88
import { isArrayLength } from "./destructuring-assignments";
99
import { LuaLibFeature, transformLuaLibFunction } from "../../utils/lualib";
10+
import { cannotAssignToNodeOfKind } from "../../utils/diagnostics";
1011

1112
function isLuaExpressionWithSideEffect(expression: lua.Expression) {
1213
return !(lua.isLiteral(expression) || lua.isIdentifier(expression));
@@ -85,7 +86,12 @@ function transformCompoundAssignment(
8586
return { precedingStatements, result: lengthSetterStatement.expression };
8687
}
8788

88-
const left = cast(context.transformExpression(lhs), lua.isAssignmentLeftHandSideExpression);
89+
const left = context.transformExpression(lhs);
90+
if (!lua.isAssignmentLeftHandSideExpression(left)) {
91+
context.diagnostics.push(cannotAssignToNodeOfKind(expression, left.kind));
92+
return { precedingStatements: [], result: left };
93+
}
94+
8995
const { precedingStatements: rightPrecedingStatements, result: right } = transformInPrecedingStatementScope(
9096
context,
9197
() => context.transformExpression(rhs)
@@ -250,7 +256,12 @@ export function transformCompoundAssignmentStatement(
250256
return [...precedingStatements, lengthSetterStatement];
251257
}
252258

253-
const left = cast(context.transformExpression(lhs), lua.isAssignmentLeftHandSideExpression);
259+
const left = context.transformExpression(lhs);
260+
if (!lua.isAssignmentLeftHandSideExpression(left)) {
261+
context.diagnostics.push(cannotAssignToNodeOfKind(node, left.kind));
262+
return [];
263+
}
264+
254265
const { precedingStatements: rightPrecedingStatements, result: right } = transformInPrecedingStatementScope(
255266
context,
256267
() => context.transformExpression(rhs)

test/unit/assignments.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,3 +506,13 @@ test.each([
506506
return [obj, objGot];
507507
`.expectToMatchJsResult();
508508
});
509+
510+
// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1412
511+
test("invalid assignment to call expression (#1412)", () => {
512+
util.testFunction`
513+
function foo(): number {
514+
return 3;
515+
}
516+
foo() += 4;
517+
`.expectNoTranspileException();
518+
});

test/util.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,12 +313,23 @@ export abstract class TestBuilder {
313313
// Actions
314314

315315
public debug(includeLualib = false): this {
316-
const transpiledFiles = this.getLuaResult().transpiledFiles;
316+
const { transpiledFiles, diagnostics } = this.getLuaResult();
317317
const luaCode = transpiledFiles
318318
.filter(f => includeLualib || f.outPath !== "lualib_bundle.lua")
319319
.map(f => `[${f.outPath}]:\n${f.lua?.replace(/^/gm, " ")}`);
320320
const value = prettyFormat.format(this.getLuaExecutionResult()).replace(/^/gm, " ");
321321
console.log(`Lua Code:\n${luaCode.join("\n")}\n\nValue:\n${value}`);
322+
323+
if (diagnostics.length > 0) {
324+
console.log(
325+
ts.formatDiagnostics(diagnostics.map(tstl.prepareDiagnosticForFormatting), {
326+
getCurrentDirectory: () => "",
327+
getCanonicalFileName: fileName => fileName,
328+
getNewLine: () => "\n",
329+
})
330+
);
331+
}
332+
322333
return this;
323334
}
324335

0 commit comments

Comments
 (0)