roblox-ts
Version:
<div align="center"><img width=25% src="https://i.imgur.com/yCjHmng.png"></div> <h1 align="center"><a href="https://roblox-ts.github.io/">roblox-ts</a></h1> <div align="center">A TypeScript-to-Lua Compiler for Roblox</div> <br> <div align="center"> <a hr
78 lines • 3.04 kB
JavaScript
;
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const ts = __importStar(require("ts-morph"));
const _1 = require(".");
const typeUtilities_1 = require("../typeUtilities");
const utility_1 = require("../utility");
function sanitizeTemplate(str) {
str = str.replace(/(^|[^\\](?:\\\\)*)"/g, '$1\\"'); // replace " with \"
str = str.replace(/(\r?\n|\r)/g, "\\$1"); // prefix new lines with \
return str;
}
exports.sanitizeTemplate = sanitizeTemplate;
function wrapQuotes(s) {
return `"${s}"`;
}
function getTemplateParts(state, node, tostring) {
if (ts.TypeGuards.isNoSubstitutionTemplateLiteral(node)) {
return {
expressions: [],
literals: [wrapQuotes(sanitizeTemplate(node.getText().slice(1, -1)))],
};
}
else {
const literals = [
wrapQuotes(sanitizeTemplate(node
.getHead()
.getText()
.slice(1, -2))),
];
for (const span of node.getTemplateSpans()) {
const literal = span.getLiteral();
literals.push(wrapQuotes(sanitizeTemplate(literal.getText().slice(1, ts.TypeGuards.isTemplateMiddle(literal) ? -2 : -1))));
}
const expressions = _1.compileList(state, node.getTemplateSpans().map(span => utility_1.skipNodesDownwards(span.getExpression())), (_, exp) => {
const expStr = _1.compileExpression(state, exp);
if (tostring) {
return typeUtilities_1.isStringType(typeUtilities_1.getType(exp)) ? expStr : `tostring(${expStr})`;
}
else {
return expStr;
}
});
return {
expressions,
literals,
};
}
}
function compileTemplateExpression(state, node) {
const parts = getTemplateParts(state, node, true);
const bin = new Array();
for (let i = 0; i < parts.expressions.length; i++) {
bin.push(parts.literals[i]);
bin.push(parts.expressions[i]);
}
bin.push(parts.literals[parts.literals.length - 1]);
return bin.filter(v => v !== `""`).join(" .. ");
}
exports.compileTemplateExpression = compileTemplateExpression;
function compileTaggedTemplateExpression(state, node) {
const tagStr = _1.compileExpression(state, utility_1.skipNodesDownwards(node.getTag()));
const parts = getTemplateParts(state, node.getTemplate(), false);
if (parts.expressions.length > 0) {
return `${tagStr}({ ${parts.literals.join(", ")} }, ${parts.expressions.join(", ")})`;
}
else {
return `${tagStr}({ ${parts.literals.join(", ")} })`;
}
}
exports.compileTaggedTemplateExpression = compileTaggedTemplateExpression;
//# sourceMappingURL=template.js.map