UNPKG

typescript-to-lua

Version:

A generic TypeScript to Lua transpiler. Write your code in TypeScript and publish Lua!

162 lines 10.1 kB
"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