typescript-to-lua
Version:
A generic TypeScript to Lua transpiler. Write your code in TypeScript and publish Lua!
162 lines • 10.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformArrayConstructorCall = transformArrayConstructorCall;
exports.transformArrayPrototypeCall = transformArrayPrototypeCall;
exports.transformArrayProperty = transformArrayProperty;
const ts = require("typescript");
const CompilerOptions_1 = require("../../CompilerOptions");
const lua = require("../../LuaAST");
const diagnostics_1 = require("../utils/diagnostics");
const lualib_1 = require("../utils/lualib");
const call_1 = require("../visitors/call");
const typescript_1 = require("../utils/typescript");
const expression_list_1 = require("../visitors/expression-list");
const lua_ast_1 = require("../utils/lua-ast");
function transformArrayConstructorCall(context, node, calledMethod) {
const signature = context.checker.getResolvedSignature(node);
const params = (0, call_1.transformArguments)(context, node.arguments, signature);
const expressionName = calledMethod.name.text;
switch (expressionName) {
case "from":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayFrom, node, ...params);
case "isArray":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayIsArray, node, ...params);
case "of":
return (0, lua_ast_1.wrapInTable)(...params);
default:
context.diagnostics.push((0, diagnostics_1.unsupportedProperty)(calledMethod.name, "Array", expressionName));
}
}
function createTableLengthExpression(context, expression, node) {
if (context.luaTarget === CompilerOptions_1.LuaTarget.Lua50) {
const tableGetn = lua.createTableIndexExpression(lua.createIdentifier("table"), lua.createStringLiteral("getn"));
return lua.createCallExpression(tableGetn, [expression], node);
}
else {
return lua.createUnaryExpression(expression, lua.SyntaxKind.LengthOperator, node);
}
}
/**
* Optimized single element Array.push
*
* array[#array+1] = el
* return (#array + 1)
*/
function transformSingleElementArrayPush(context, node, caller, param) {
const arrayIdentifier = lua.isIdentifier(caller) ? caller : (0, expression_list_1.moveToPrecedingTemp)(context, caller);
// #array + 1
let lengthExpression = lua.createBinaryExpression(createTableLengthExpression(context, arrayIdentifier), lua.createNumericLiteral(1), lua.SyntaxKind.AdditionOperator);
const expressionIsUsed = (0, typescript_1.expressionResultIsUsed)(node);
if (expressionIsUsed) {
// store length in a temp
lengthExpression = (0, expression_list_1.moveToPrecedingTemp)(context, lengthExpression);
}
const pushStatement = lua.createAssignmentStatement(lua.createTableIndexExpression(arrayIdentifier, lengthExpression), param, node);
context.addPrecedingStatements(pushStatement);
return expressionIsUsed ? lengthExpression : lua.createNilLiteral();
}
function transformArrayPrototypeCall(context, node, calledMethod) {
var _a, _b, _c;
const signature = context.checker.getResolvedSignature(node);
const [caller, params] = (0, call_1.transformCallAndArguments)(context, calledMethod.expression, node.arguments, signature);
const expressionName = calledMethod.name.text;
switch (expressionName) {
case "at":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayAt, node, caller, ...params);
case "concat":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayConcat, node, caller, ...params);
case "entries":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayEntries, node, caller);
case "fill":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayFill, node, caller, ...params);
case "push":
if (node.arguments.length === 1) {
const param = (_a = params[0]) !== null && _a !== void 0 ? _a : lua.createNilLiteral();
if ((0, lua_ast_1.isUnpackCall)(param)) {
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayPushArray, node, caller, (_b = param.params[0]) !== null && _b !== void 0 ? _b : lua.createNilLiteral());
}
if (!lua.isDotsLiteral(param)) {
return transformSingleElementArrayPush(context, node, caller, param);
}
}
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayPush, node, caller, ...params);
case "reverse":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayReverse, node, caller);
case "shift":
return lua.createCallExpression(lua.createTableIndexExpression(lua.createIdentifier("table"), lua.createStringLiteral("remove")), [caller, lua.createNumericLiteral(1)], node);
case "unshift":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayUnshift, node, caller, ...params);
case "sort":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArraySort, node, caller, ...params);
case "pop":
return lua.createCallExpression(lua.createTableIndexExpression(lua.createIdentifier("table"), lua.createStringLiteral("remove")), [caller], node);
case "forEach":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayForEach, node, caller, ...params);
case "find":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayFind, node, caller, ...params);
case "findIndex":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayFindIndex, node, caller, ...params);
case "includes":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayIncludes, node, caller, ...params);
case "indexOf":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayIndexOf, node, caller, ...params);
case "map":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayMap, node, caller, ...params);
case "filter":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayFilter, node, caller, ...params);
case "reduce":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayReduce, node, caller, ...params);
case "reduceRight":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayReduceRight, node, caller, ...params);
case "some":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArraySome, node, caller, ...params);
case "every":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayEvery, node, caller, ...params);
case "slice":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArraySlice, node, caller, ...params);
case "splice":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArraySplice, node, caller, ...params);
case "join":
const callerType = context.checker.getTypeAtLocation(calledMethod.expression);
const elementType = context.checker.getElementTypeOfArrayType(callerType);
if (elementType &&
(0, typescript_1.typeAlwaysHasSomeOfFlags)(context, elementType, ts.TypeFlags.StringLike | ts.TypeFlags.NumberLike)) {
const defaultSeparatorLiteral = lua.createStringLiteral(",");
const param = (_c = params[0]) !== null && _c !== void 0 ? _c : lua.createNilLiteral();
const parameters = [
caller,
node.arguments.length === 0
? defaultSeparatorLiteral
: lua.isStringLiteral(param)
? param
: lua.createBinaryExpression(param, defaultSeparatorLiteral, lua.SyntaxKind.OrOperator),
];
return lua.createCallExpression(lua.createTableIndexExpression(lua.createIdentifier("table"), lua.createStringLiteral("concat")), parameters, node);
}
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayJoin, node, caller, ...params);
case "flat":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayFlat, node, caller, ...params);
case "flatMap":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayFlatMap, node, caller, ...params);
case "toReversed":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayToReversed, node, caller, ...params);
case "toSorted":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayToSorted, node, caller, ...params);
case "toSpliced":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayToSpliced, node, caller, ...params);
case "with":
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayWith, node, caller, ...params);
default:
context.diagnostics.push((0, diagnostics_1.unsupportedProperty)(calledMethod.name, "array", expressionName));
}
}
function transformArrayProperty(context, node) {
switch (node.name.text) {
case "length":
const expression = context.transformExpression(node.expression);
return createTableLengthExpression(context, expression, node);
default:
return undefined;
}
}
//# sourceMappingURL=array.js.map