nisp
Version:
A language that for easily build cross-language language
40 lines (39 loc) • 1.34 kB
JavaScript
;
exports.__esModule = true;
var core_1 = require("../core");
exports["default"] = core_1.macro(function (ctx) {
var sandbox = ctx.sandbox, ast = ctx.ast, env = ctx.env, index = ctx.index;
ast = ast.slice(1);
if (!ast.length) {
return;
}
var defaultNode;
if (ast[ast.length - 1][0] === 'default') {
defaultNode = ast[ast.length - 1];
ast = ast.slice(0, -1);
}
if (!ast.length) {
return core_1["default"](defaultNode[1], sandbox, env, ctx, index);
}
var expressionValue;
var hasExpression = false;
if (ast[0][0] !== 'case') {
expressionValue = core_1["default"](ast[0], sandbox, env, ctx, index);
hasExpression = true;
ast = ast.slice(1);
}
for (var _i = 0, ast_1 = ast; _i < ast_1.length; _i++) {
var node = ast_1[_i];
if (node[0] !== 'case') {
core_1.error(ctx, 'switch unexpected identifier');
return;
}
var value = core_1["default"](node[1], sandbox, env, ctx, index);
if (hasExpression && (expressionValue === value) || !hasExpression && value) {
return core_1["default"](node[2], sandbox, env, ctx, index);
}
}
if (defaultNode) {
return core_1["default"](defaultNode[1], sandbox, env, ctx, index);
}
});