@kipper/target-js
Version:
The JavaScript target for the Kipper compiler 🦊
119 lines • 5.77 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.JavaScriptTargetBuiltInGenerator = exports.genJSVariable = exports.genJSFunction = void 0;
const tslib_1 = require("tslib");
const core_1 = require("@kipper/core");
const tools_1 = require("./tools");
const target_1 = require("./target");
function genJSFunction(signature, body, ignoreParams = false) {
return [[signature.identifier, ":", " ", (0, tools_1.createJSFunctionSignature)(signature, ignoreParams), " ", body]];
}
exports.genJSFunction = genJSFunction;
function genJSVariable(varSpec, value) {
if (varSpec.local) {
return ["const", " ", target_1.TargetJS.getBuiltInIdentifier(varSpec), " ", "=", " ", value, ";"];
}
return [varSpec.identifier, ":", " ", value];
}
exports.genJSVariable = genJSVariable;
class JavaScriptTargetBuiltInGenerator extends core_1.KipperTargetBuiltInGenerator {
numToStr(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
const convArgIdentifier = signature.params[0];
return genJSFunction(signature, `{ return (${convArgIdentifier}).toString(); }`);
});
}
boolToStr(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
const convArgIdentifier = signature.params[0];
return genJSFunction(signature, `{ return \`\${${convArgIdentifier}}\`; }`);
});
}
voidToStr(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
return genJSFunction(signature, `{ return "void"; }`, true);
});
}
nullToStr(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
return genJSFunction(signature, `{ return "null"; }`, true);
});
}
undefinedToStr(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
return genJSFunction(signature, `{ return "undefined"; }`, true);
});
}
strToNum(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
const convArgIdentifier = signature.params[0];
return genJSFunction(signature, `{ return parseInt(${convArgIdentifier}); }`);
});
}
boolToNum(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
const convArgIdentifier = signature.params[0];
return genJSFunction(signature, `{ return ${convArgIdentifier} ? 1 : 0; }`);
});
}
slice(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
const objLikeIdentifier = signature.params[0];
const startIdentifier = signature.params[1];
const endIdentifier = signature.params[2];
return genJSFunction(signature, `{ return ${objLikeIdentifier} ? ${objLikeIdentifier}.slice(${startIdentifier}, ${endIdentifier}) : ${objLikeIdentifier}; }`);
});
}
index(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
const arrayLikeIdentifier = signature.params[0];
const indexIdentifier = signature.params[1];
return genJSFunction(signature, `{ if (${indexIdentifier} >= ${arrayLikeIdentifier}.length) ` +
`throw new __kipper.IndexError(\`Index '\${${indexIdentifier}}' out of bonds of array-like.\`); ` +
`return ${arrayLikeIdentifier}[${indexIdentifier}]; }`);
});
}
repeatString(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
const toRepeatIdentifier = signature.params[0];
const timesIdentifier = signature.params[1];
return genJSFunction(signature, `{ return ${toRepeatIdentifier}.repeat(${timesIdentifier}); }`);
});
}
print(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
const printArgIdentifier = signature.params[0];
return genJSFunction(signature, `{ console.log(${printArgIdentifier}); }`);
});
}
len(funcSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const signature = (0, tools_1.getJSFunctionSignature)(funcSpec);
const lenArgIdentifier = signature.params[0];
return genJSFunction(signature, `{ return ${lenArgIdentifier}.length; }`);
});
}
__name__(varSpec, programCtx) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
return [genJSVariable(varSpec, `"${programCtx.fileName}"`)];
});
}
NaN(varSpec) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
return [genJSVariable(varSpec, "NaN")];
});
}
}
exports.JavaScriptTargetBuiltInGenerator = JavaScriptTargetBuiltInGenerator;
//# sourceMappingURL=built-in-generator.js.map