mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
124 lines • 3.85 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const tokenstream_1 = require("./tokenstream");
function compileGetters(params) {
return params.map((p, i) => {
const type = p.type;
if (type === 'code') {
return `let _${p.name} = luaL_ref(L, LUA_REGISTRYINDEX);`;
}
else {
let func;
if (type === 'integer') {
func = 'luaL_checkinteger';
}
else if (type === 'real') {
func = 'luaL_checknumber';
}
else if (type === 'boolean') {
func = 'lua_toboolean';
}
else if (type === 'string') {
func = 'luaL_checkstring';
}
else {
func = 'lua_touserdata';
}
return `let _${p.name} = ${func}(L, ${i + 1});`;
}
}).join('\n');
}
function compileReturn(type) {
if (type === 'nothing') {
return 'return 0';
}
else {
let func;
let value;
if (type === 'integer') {
func = 'lua_pushinteger';
value = '0';
}
else if (type === 'real') {
func = 'lua_pushnumber';
value = '0';
}
else if (type === 'boolean') {
func = 'lua_pushboolean';
value = 'false';
}
else if (type === 'string') {
func = 'lua_pushstring';
value = `''`;
}
else if (type === 'code') {
throw 'CODE??';
}
else {
func = 'lua_pushlightuserdata';
value = `{name: 'FAKE'}`;
}
return `${func}(L, ${value});\nreturn 1;`;
}
}
function compileNative(stream, isConstant) {
const name = stream.readSafe();
const params = [];
stream.read(); // takes
const token = stream.readSafe(); // nothing or type
if (token !== 'nothing') {
params.push({ type: token, name: stream.readSafe() });
while (stream.read() === ',') {
params.push({ type: stream.readSafe(), name: stream.readSafe() });
}
}
else {
stream.read(); // returns
}
const returnType = stream.readSafe();
let luaParams;
if (params.length) {
luaParams = 'C: Context, L: lua_State';
}
else {
luaParams = '_C: Context, _L: lua_State';
}
const decl = `
/**
* ${isConstant ? 'constant ' : ''}native ${name} takes ${params.length ? params.map((p) => `${p.type} ${p.name}`).join(', ') : 'nothing'} returns ${returnType}
*/
function ${name}(${luaParams}): number {
${compileGetters(params)}
console.warn('${name} was called but is not implemented :(');
${compileReturn(returnType)}
}`;
return { name, decl };
}
function compileBindings(names) {
return `
/**
* Bind natives to the given context.
*/
export default function bind(C: Context): void {\nlet L = C.L;\n${names.map((name) => ` lua_register(L, '${name}', ${name}.bind(null, C));`).join('\n')}\n}`;
}
function compileNatives(jass) {
const stream = new tokenstream_1.default(jass);
const names = [];
const decls = [];
let token;
while ((token = stream.read()) !== undefined) {
let isConstant = false;
if (token === 'constant') {
isConstant = true;
token = stream.read();
}
if (token === 'native') {
const { name, decl } = compileNative(stream, isConstant);
names.push(name);
decls.push(decl);
}
}
return `${decls.join('\n')}\n${compileBindings(names)}\n`;
}
exports.default = compileNatives;
//# sourceMappingURL=compilenatives.js.map
;