roblox-ts
Version:
A TypeScript-to-Luau Compiler for Roblox
107 lines • 5.42 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.transformParameters = transformParameters;
const luau_ast_1 = __importDefault(require("@roblox-ts/luau-ast"));
const diagnostics_1 = require("../../Shared/diagnostics");
const DiagnosticService_1 = require("../classes/DiagnosticService");
const transformArrayBindingPattern_1 = require("./binding/transformArrayBindingPattern");
const transformObjectBindingPattern_1 = require("./binding/transformObjectBindingPattern");
const transformIdentifier_1 = require("./expressions/transformIdentifier");
const transformInitializer_1 = require("./transformInitializer");
const isMethod_1 = require("../util/isMethod");
const validateIdentifier_1 = require("../util/validateIdentifier");
const typescript_1 = __importDefault(require("typescript"));
function optimizeArraySpreadParameter(state, parameters, bindingPattern) {
for (const element of bindingPattern.elements) {
if (typescript_1.default.isOmittedExpression(element)) {
luau_ast_1.default.list.push(parameters, luau_ast_1.default.tempId());
}
else {
if (element.dotDotDotToken) {
DiagnosticService_1.DiagnosticService.addDiagnostic(diagnostics_1.errors.noSpreadDestructuring(element));
return;
}
const name = element.name;
if (typescript_1.default.isIdentifier(name)) {
const paramId = (0, transformIdentifier_1.transformIdentifierDefined)(state, name);
(0, validateIdentifier_1.validateIdentifier)(state, name);
luau_ast_1.default.list.push(parameters, paramId);
if (element.initializer) {
state.prereq((0, transformInitializer_1.transformInitializer)(state, paramId, element.initializer));
}
}
else {
const paramId = luau_ast_1.default.tempId("param");
luau_ast_1.default.list.push(parameters, paramId);
if (element.initializer) {
state.prereq((0, transformInitializer_1.transformInitializer)(state, paramId, element.initializer));
}
if (typescript_1.default.isArrayBindingPattern(name)) {
(0, transformArrayBindingPattern_1.transformArrayBindingPattern)(state, name, paramId);
}
else {
(0, transformObjectBindingPattern_1.transformObjectBindingPattern)(state, name, paramId);
}
}
}
}
}
function transformParameters(state, node) {
const parameters = luau_ast_1.default.list.make();
const statements = luau_ast_1.default.list.make();
let hasDotDotDot = false;
if ((0, isMethod_1.isMethod)(state, node)) {
luau_ast_1.default.list.push(parameters, luau_ast_1.default.globals.self);
}
for (const parameter of node.parameters) {
if (typescript_1.default.isThisIdentifier(parameter.name)) {
continue;
}
if (parameter.dotDotDotToken && typescript_1.default.isArrayBindingPattern(parameter.name)) {
const prereqs = state.capturePrereqs(() => optimizeArraySpreadParameter(state, parameters, parameter.name));
luau_ast_1.default.list.pushList(statements, prereqs);
continue;
}
let paramId;
if (typescript_1.default.isIdentifier(parameter.name)) {
paramId = (0, transformIdentifier_1.transformIdentifierDefined)(state, parameter.name);
(0, validateIdentifier_1.validateIdentifier)(state, parameter.name);
}
else {
paramId = luau_ast_1.default.tempId("param");
}
if (parameter.dotDotDotToken) {
hasDotDotDot = true;
luau_ast_1.default.list.push(statements, luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.VariableDeclaration, {
left: paramId,
right: luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.Array, {
members: luau_ast_1.default.list.make(luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.VarArgsLiteral, {})),
}),
}));
}
else {
luau_ast_1.default.list.push(parameters, paramId);
}
if (parameter.initializer) {
luau_ast_1.default.list.push(statements, (0, transformInitializer_1.transformInitializer)(state, paramId, parameter.initializer));
}
if (!typescript_1.default.isIdentifier(parameter.name)) {
const bindingPattern = parameter.name;
if (typescript_1.default.isArrayBindingPattern(bindingPattern)) {
luau_ast_1.default.list.pushList(statements, state.capturePrereqs(() => (0, transformArrayBindingPattern_1.transformArrayBindingPattern)(state, bindingPattern, paramId)));
}
else {
luau_ast_1.default.list.pushList(statements, state.capturePrereqs(() => (0, transformObjectBindingPattern_1.transformObjectBindingPattern)(state, bindingPattern, paramId)));
}
}
}
return {
parameters,
statements,
hasDotDotDot,
};
}
//# sourceMappingURL=transformParameters.js.map