Allow new Array() syntax for constructing lua tables (#1609) · TypeScriptToLua/TypeScriptToLua@6dfe252 · GitHub
Skip to content

Commit 6dfe252

Browse files
authored
Allow new Array() syntax for constructing lua tables (#1609)
* allow newArray syntax for constructing arrays * Also support array constructor with arguments
1 parent 030bb2a commit 6dfe252

4 files changed

Lines changed: 67 additions & 3 deletions

File tree

‎src/transformation/builtins/index.ts‎

Lines changed: 4 additions & 1 deletion

‎src/transformation/utils/diagnostics.ts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,7 @@ export const cannotAssignToNodeOfKind = createErrorDiagnosticFactory(
172172
export const incompleteFieldDecoratorWarning = createWarningDiagnosticFactory(
173173
"You are using a class field decorator, note that tstl ignores returned value initializers!"
174174
);
175+
176+
export const unsupportedArrayWithLengthConstructor = createErrorDiagnosticFactory(
177+
`Constructing new Array with length is not supported.`
178+
);

‎src/transformation/visitors/class/new.ts‎

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,42 @@ import * as ts from "typescript";
22
import * as lua from "../../../LuaAST";
33
import { FunctionVisitor } from "../../context";
44
import { AnnotationKind, getTypeAnnotations } from "../../utils/annotations";
5-
import { annotationInvalidArgumentCount } from "../../utils/diagnostics";
5+
import { annotationInvalidArgumentCount, unsupportedArrayWithLengthConstructor } from "../../utils/diagnostics";
66
import { LuaLibFeature, transformLuaLibFunction } from "../../utils/lualib";
77
import { transformArguments, transformCallAndArguments } from "../call";
88
import { isTableNewCall } from "../language-extensions/table";
9+
import { tryGetStandardLibrarySymbolOfType } from "../../builtins";
910

1011
export const transformNewExpression: FunctionVisitor<ts.NewExpression> = (node, context) => {
1112
if (isTableNewCall(context, node)) {
1213
return lua.createTableExpression(undefined, node);
1314
}
1415

16+
const constructorType = context.checker.getTypeAtLocation(node.expression);
17+
if (tryGetStandardLibrarySymbolOfType(context, constructorType)?.name === "ArrayConstructor") {
18+
if (node.arguments === undefined || node.arguments.length === 0) {
19+
// turn new Array<>() into a simple {}
20+
return lua.createTableExpression([], node);
21+
} else {
22+
// More than one argument, check if items constructor
23+
const signature = context.checker.getResolvedSignature(node);
24+
const signatureDeclaration = signature?.getDeclaration();
25+
if (
26+
signatureDeclaration?.parameters.length === 1 &&
27+
signatureDeclaration.parameters[0].dotDotDotToken === undefined
28+
) {
29+
context.diagnostics.push(unsupportedArrayWithLengthConstructor(node));
30+
return lua.createTableExpression([], node);
31+
} else {
32+
const callArguments = transformArguments(context, node.arguments, signature);
33+
return lua.createTableExpression(
34+
callArguments.map(e => lua.createTableFieldExpression(e)),
35+
node
36+
);
37+
}
38+
}
39+
}
40+
1541
const signature = context.checker.getResolvedSignature(node);
1642
const [name, params] = transformCallAndArguments(context, node.expression, node.arguments ?? [], signature);
1743

‎test/unit/builtins/array.spec.ts‎

Lines changed: 32 additions & 1 deletion

0 commit comments

Comments
 (0)