roblox-ts
Version:
A TypeScript-to-Luau Compiler for Roblox
98 lines • 5.52 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformObjectLiteralExpression = transformObjectLiteralExpression;
const luau_ast_1 = __importDefault(require("@roblox-ts/luau-ast"));
const diagnostics_1 = require("../../../Shared/diagnostics");
const DiagnosticService_1 = require("../../classes/DiagnosticService");
const transformExpression_1 = require("./transformExpression");
const transformMethodDeclaration_1 = require("../transformMethodDeclaration");
const transformPropertyName_1 = require("../transformPropertyName");
const createTruthinessChecks_1 = require("../../util/createTruthinessChecks");
const pointer_1 = require("../../util/pointer");
const types_1 = require("../../util/types");
const validateMethodAssignment_1 = require("../../util/validateMethodAssignment");
const typescript_1 = __importDefault(require("typescript"));
function transformPropertyAssignment(state, ptr, name, initializer) {
let [left, leftPrereqs] = state.capture(() => (0, transformPropertyName_1.transformPropertyName)(state, name));
const [right, rightPrereqs] = state.capture(() => (0, transformExpression_1.transformExpression)(state, initializer));
if (!luau_ast_1.default.list.isEmpty(leftPrereqs) || !luau_ast_1.default.list.isEmpty(rightPrereqs)) {
(0, pointer_1.disableMapInline)(state, ptr);
state.prereqList(leftPrereqs);
left = state.pushToVar(left, "left");
}
state.prereqList(rightPrereqs);
(0, pointer_1.assignToMapPointer)(state, ptr, left, right);
}
function transformSpreadAssignment(state, ptr, property) {
const expType = state.typeChecker.getNonOptionalType(state.getType(property.expression));
const symbol = (0, types_1.getFirstDefinedSymbol)(state, expType);
if (symbol && state.services.macroManager.isMacroOnlyClass(symbol)) {
DiagnosticService_1.DiagnosticService.addDiagnostic(diagnostics_1.errors.noMacroObjectSpread(property));
}
const type = state.getType(property.expression);
const definitelyObject = (0, types_1.isDefinitelyType)(type, types_1.isObjectType);
if (definitelyObject && luau_ast_1.default.isMap(ptr.value) && luau_ast_1.default.list.isEmpty(ptr.value.fields)) {
ptr.value = state.pushToVar(luau_ast_1.default.call(luau_ast_1.default.globals.table.clone, [(0, transformExpression_1.transformExpression)(state, property.expression)]), ptr.name);
state.prereq(luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.CallStatement, {
expression: luau_ast_1.default.call(luau_ast_1.default.globals.setmetatable, [ptr.value, luau_ast_1.default.nil()]),
}));
return;
}
(0, pointer_1.disableMapInline)(state, ptr);
let spreadExp = (0, transformExpression_1.transformExpression)(state, property.expression);
if (!definitelyObject) {
spreadExp = state.pushToVarIfComplex(spreadExp, "spread");
}
const keyId = luau_ast_1.default.tempId("k");
const valueId = luau_ast_1.default.tempId("v");
let statement = luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.ForStatement, {
ids: luau_ast_1.default.list.make(keyId, valueId),
expression: spreadExp,
statements: luau_ast_1.default.list.make(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: keyId,
}),
operator: "=",
right: valueId,
})),
});
if (!definitelyObject) {
statement = luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.IfStatement, {
condition: (0, createTruthinessChecks_1.createTruthinessChecks)(state, spreadExp, property.expression),
statements: luau_ast_1.default.list.make(statement),
elseBody: luau_ast_1.default.list.make(),
});
}
state.prereq(statement);
}
function transformObjectLiteralExpression(state, node) {
const ptr = (0, pointer_1.createMapPointer)("object");
for (const property of node.properties) {
(0, validateMethodAssignment_1.validateMethodAssignment)(state, property);
if (typescript_1.default.isPropertyAssignment(property)) {
if (typescript_1.default.isPrivateIdentifier(property.name)) {
DiagnosticService_1.DiagnosticService.addDiagnostic(diagnostics_1.errors.noPrivateIdentifier(property.name));
continue;
}
transformPropertyAssignment(state, ptr, property.name, property.initializer);
}
else if (typescript_1.default.isShorthandPropertyAssignment(property)) {
transformPropertyAssignment(state, ptr, property.name, property.name);
}
else if (typescript_1.default.isSpreadAssignment(property)) {
transformSpreadAssignment(state, ptr, property);
}
else if (typescript_1.default.isMethodDeclaration(property)) {
state.prereqList((0, transformMethodDeclaration_1.transformMethodDeclaration)(state, property, ptr));
}
else {
DiagnosticService_1.DiagnosticService.addDiagnostic(diagnostics_1.errors.noGetterSetter(property));
}
}
return ptr.value;
}
//# sourceMappingURL=transformObjectLiteralExpression.js.map