UNPKG

roblox-ts

Version:

A TypeScript-to-Luau Compiler for Roblox

68 lines 3.44 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.transformFunctionDeclaration = transformFunctionDeclaration; 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 transformIdentifier_1 = require("../expressions/transformIdentifier"); const transformParameters_1 = require("../transformParameters"); const transformStatementList_1 = require("../transformStatementList"); const validateIdentifier_1 = require("../../util/validateIdentifier"); const wrapStatementsAsGenerator_1 = require("../../util/wrapStatementsAsGenerator"); const typescript_1 = __importDefault(require("typescript")); function transformFunctionDeclaration(state, node) { if (!node.body) { return luau_ast_1.default.list.make(); } const isExportDefault = typescript_1.default.hasSyntacticModifier(node, typescript_1.default.ModifierFlags.ExportDefault); (0, assert_1.assert)(node.name || isExportDefault); if (node.name) { (0, validateIdentifier_1.validateIdentifier)(state, node.name); } const name = node.name ? (0, transformIdentifier_1.transformIdentifierDefined)(state, node.name) : luau_ast_1.default.id("default"); let { statements, parameters, hasDotDotDot } = (0, transformParameters_1.transformParameters)(state, node); luau_ast_1.default.list.pushList(statements, (0, transformStatementList_1.transformStatementList)(state, node.body, node.body.statements)); let localize = isExportDefault; if (node.name) { const symbol = state.typeChecker.getSymbolAtLocation(node.name); (0, assert_1.assert)(symbol); localize = state.isHoisted.get(symbol) !== true; } const isAsync = typescript_1.default.hasSyntacticModifier(node, typescript_1.default.ModifierFlags.Async); if (node.asteriskToken) { if (isAsync) { DiagnosticService_1.DiagnosticService.addDiagnostic(diagnostics_1.errors.noAsyncGeneratorFunctions(node)); } statements = (0, wrapStatementsAsGenerator_1.wrapStatementsAsGenerator)(state, node, statements); } if (isAsync) { const right = luau_ast_1.default.call(state.TS(node, "async"), [ luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.FunctionExpression, { hasDotDotDot, parameters, statements, }), ]); if (localize) { return luau_ast_1.default.list.make(luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.VariableDeclaration, { left: name, right, })); } else { return luau_ast_1.default.list.make(luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.Assignment, { left: name, operator: "=", right, })); } } else { return luau_ast_1.default.list.make(luau_ast_1.default.create(luau_ast_1.default.SyntaxKind.FunctionDeclaration, { localize, name, statements, parameters, hasDotDotDot })); } } //# sourceMappingURL=transformFunctionDeclaration.js.map