UNPKG

roblox-ts

Version:

A TypeScript-to-Luau Compiler for Roblox

79 lines 3.98 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.transformArrayLiteralExpression = transformArrayLiteralExpression; const luau_ast_1 = __importDefault(require("@roblox-ts/luau-ast")); const assert_1 = require("../../../Shared/util/assert"); const transformExpression_1 = require("./transformExpression"); const ensureTransformOrder_1 = require("../../util/ensureTransformOrder"); const getAddIterableToArrayBuilder_1 = require("../../util/getAddIterableToArrayBuilder"); const pointer_1 = require("../../util/pointer"); const typescript_1 = __importDefault(require("typescript")); function transformArrayLiteralExpression(state, node) { if (!node.elements.find(element => typescript_1.default.isSpreadElement(element))) { return luau_ast_1.default.array((0, ensureTransformOrder_1.ensureTransformOrder)(state, node.elements)); } const ptr = (0, pointer_1.createArrayPointer)("array"); const lengthId = luau_ast_1.default.tempId("length"); let lengthInitialized = false; let amtElementsSinceUpdate = 0; function updateLengthId() { const right = luau_ast_1.default.unary("#", ptr.value); if (lengthInitialized) { state.prereq(luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.Assignment, { left: lengthId, operator: "=", right, })); } else { state.prereq(luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.VariableDeclaration, { left: lengthId, right, })); lengthInitialized = true; } amtElementsSinceUpdate = 0; } for (let i = 0; i < node.elements.length; i++) { const element = node.elements[i]; if (typescript_1.default.isSpreadElement(element)) { if (luau_ast_1.default.isArray(ptr.value)) { (0, pointer_1.disableArrayInline)(state, ptr); updateLengthId(); } (0, assert_1.assert)(luau_ast_1.default.isAnyIdentifier(ptr.value)); const type = state.getType(element.expression); const addIterableToArrayBuilder = (0, getAddIterableToArrayBuilder_1.getAddIterableToArrayBuilder)(state, element.expression, type); const spreadExp = (0, transformExpression_1.transformExpression)(state, element.expression); const shouldUpdateLengthId = i < node.elements.length - 1; state.prereqList(addIterableToArrayBuilder(state, spreadExp, ptr.value, lengthId, amtElementsSinceUpdate, shouldUpdateLengthId)); } else { const [expression, prereqs] = state.capture(() => (0, transformExpression_1.transformExpression)(state, element)); if (luau_ast_1.default.isArray(ptr.value) && !luau_ast_1.default.list.isEmpty(prereqs)) { (0, pointer_1.disableArrayInline)(state, ptr); updateLengthId(); } if (luau_ast_1.default.isArray(ptr.value)) { luau_ast_1.default.list.push(ptr.value.members, expression); } else { state.prereqList(prereqs); state.prereq(luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.Assignment, { left: luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.ComputedIndexExpression, { expression: ptr.value, index: luau_ast_1.default.binary(lengthId, "+", luau_ast_1.default.number(amtElementsSinceUpdate + 1)), }), operator: "=", right: expression, })); } amtElementsSinceUpdate++; } } return ptr.value; } //# sourceMappingURL=transformArrayLiteralExpression.js.map