UNPKG

roblox-ts

Version:

A TypeScript-to-Luau Compiler for Roblox

49 lines 3.16 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.transformWritableExpression = transformWritableExpression; exports.transformWritableAssignment = transformWritableAssignment; const luau_ast_1 = __importDefault(require("@roblox-ts/luau-ast")); const diagnostics_1 = require("../../Shared/diagnostics"); const assert_1 = require("../../Shared/util/assert"); const DiagnosticService_1 = require("../classes/DiagnosticService"); const transformExpression_1 = require("./expressions/transformExpression"); const addOneIfArrayType_1 = require("../util/addOneIfArrayType"); const convertToIndexableExpression_1 = require("../util/convertToIndexableExpression"); const ensureTransformOrder_1 = require("../util/ensureTransformOrder"); const traversal_1 = require("../util/traversal"); const typescript_1 = __importDefault(require("typescript")); function transformWritableExpression(state, node, readAfterWrite) { if (typescript_1.default.isPrototypeAccess(node)) { DiagnosticService_1.DiagnosticService.addDiagnostic(diagnostics_1.errors.noPrototype(node)); } if (typescript_1.default.isPropertyAccessExpression(node)) { const expression = (0, transformExpression_1.transformExpression)(state, node.expression); return luau_ast_1.default.property(readAfterWrite ? state.pushToVarIfNonId(expression, "exp") : (0, convertToIndexableExpression_1.convertToIndexableExpression)(expression), node.name.text); } else if (typescript_1.default.isElementAccessExpression(node)) { const [expression, index] = (0, ensureTransformOrder_1.ensureTransformOrder)(state, [node.expression, node.argumentExpression]); const indexExp = (0, addOneIfArrayType_1.addOneIfArrayType)(state, state.getType(node.expression), index); return luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.ComputedIndexExpression, { expression: readAfterWrite ? state.pushToVarIfNonId(expression, "exp") : (0, convertToIndexableExpression_1.convertToIndexableExpression)(expression), index: readAfterWrite ? state.pushToVarIfComplex(indexExp, "index") : indexExp, }); } else { const transformed = (0, transformExpression_1.transformExpression)(state, (0, traversal_1.skipDownwards)(node)); (0, assert_1.assert)(luau_ast_1.default.isWritableExpression(transformed)); return transformed; } } function transformWritableAssignment(state, writeNode, valueNode, readAfterWrite = false, readBeforeWrite = false) { const writable = transformWritableExpression(state, writeNode, readAfterWrite); const [value, prereqs] = state.capture(() => (0, transformExpression_1.transformExpression)(state, valueNode)); const readable = !readBeforeWrite || luau_ast_1.default.list.isEmpty(prereqs) ? writable : state.pushToVar(writable, "readable"); state.prereqList(prereqs); return { writable, readable, value }; } //# sourceMappingURL=transformWritable.js.map