@fink/loxia
Version:
A fink to JavaScript compiler.
461 lines (390 loc) • 12.6 kB
JavaScript
const {
_in_
} = require("@fink/js-interop/runtime.js");
const types_0 = require("@babel/types");
const arrowFunctionExpression_0 = types_0.arrowFunctionExpression;
const blockStatement_0 = types_0.blockStatement;
const returnStatement_0 = types_0.returnStatement;
const restElement_0 = types_0.restElement;
const labeledStatement_0 = types_0.labeledStatement;
const {
get_refs: get_refs_0
} = require("../../ir/context.js");
const {
dec_ref: dec_ref_0
} = require("../../ir/context.js");
const {
update_value: update_value_0
} = require("../../ir/context.js");
const {
transform_exprs: transform_exprs_0
} = require("../transform.js");
const {
add: add_0
} = require("../context.js");
const {
set_js: set_js_0
} = require("../context.js");
const {
set_js2: set_js2_0
} = require("../context.js");
const {
ident: ident_0
} = require("../identifier/init.js");
const clean_args_0 = (...args_0) => {
clean_args_0: do {
const args_1 = args_0[0];
const body_0 = args_0[1];
const ctx_0 = args_0[2];
const hdm_0 = args_0[3];
const out_0 = undefined === hdm_0 ? [] : hdm_0;
/* istanbul ignore else */
if (null != args_1) {
/* istanbul ignore else */
if (true === args_1.c < 0) {
return [out_0, body_0, ctx_0];
}
}
/* istanbul ignore else */
if (null != args_1) {
/* istanbul ignore else */
if (undefined !== args_1[args_1.c]) {
args_0 = [{ ...args_1,
c: args_1.c - 1
}, body_0, ctx_0, [args_1[args_1.c], ...out_0]];
continue clean_args_0;
}
}
const unused_0 = ident_0({
i: `_${args_1.c}`
});
args_0 = [{ ...args_1,
c: args_1.c - 1
}, body_0, ctx_0, [unused_0, ...out_0]];
continue clean_args_0;
} while (true);
};
const split_args_body_0 = (...args_2) => {
split_args_body_0: do {
const dlst_0 = args_2[0];
const hdm_1 = dlst_0[0];
const expr_0 = undefined === hdm_1 ? false : hdm_1;
const tail_5 = dlst_0.slice(1);
const args_id_0 = args_2[1];
const ctx_1 = args_2[2];
const hdm_2 = args_2[3];
const args_3 = undefined === hdm_2 ? {
c: -1
} : hdm_2;
const hdm_3 = args_2[4];
const body_1 = undefined === hdm_3 ? [] : hdm_3;
/* istanbul ignore else */
if (expr_0 === false) {
return [args_3, body_1, ctx_1];
}
/* istanbul ignore else */
if (null != expr_0) {
const itm_11 = expr_0[0];
/* istanbul ignore else */
if (null != itm_11) {
/* istanbul ignore else */
if (itm_11.f === `tpl_i`) {
const itm_13 = itm_11.args;
/* istanbul ignore else */
if (null != itm_13) {
const itm_14 = itm_13[0];
/* istanbul ignore else */
if (null != itm_14) {
/* istanbul ignore else */
if (itm_14.i === args_id_0.i) {
const val_17 = expr_0[0].args;
const idx_0 = val_17[1];
const arg_id_0 = expr_0[1][0];
/* istanbul ignore else */
if (true === idx_0 < 0) {
args_2 = [tail_5, args_id_0, ctx_1, args_3, [...body_1, expr_0]];
continue split_args_body_0;
}
/* istanbul ignore else */
if (null != args_3) {
/* istanbul ignore else */
if (args_3.foo === true) {
args_2 = [tail_5, args_id_0, ctx_1, args_3, [...body_1, [{ ...expr_0[0],
args: [val_17[0], idx_0 - args_3.c - 1]
}, [arg_id_0]]]];
continue split_args_body_0;
}
}
const arg_32 = ident_0(arg_id_0);
const ppr_0 = (prtl_0 => {
const pfn_1 = set_js2_0(expr_0, arg_32, prtl_0);
return pfn_1;
})(ctx_1);
const ppr_1 = (prtl_1 => {
const pfn_3 = dec_ref_0(args_id_0, prtl_1);
return pfn_3;
})(ppr_0);
args_2 = [tail_5, args_id_0, ppr_1, { ...args_3,
c: idx_0,
[idx_0]: arg_32
}, body_1];
continue split_args_body_0;
}
}
}
}
}
}
/* istanbul ignore else */
if (null != expr_0) {
const itm_4 = expr_0[0];
/* istanbul ignore else */
if (null != itm_4) {
/* istanbul ignore else */
if (itm_4.f === `tpl_s`) {
const itm_6 = itm_4.args;
/* istanbul ignore else */
if (null != itm_6) {
const itm_7 = itm_6[0];
/* istanbul ignore else */
if (null != itm_7) {
/* istanbul ignore else */
if (itm_7.i === args_id_0.i) {
const drec_2 = expr_0[0];
const key_35 = `args`;
const val_10 = drec_2.args;
const args_id_1 = val_10[0];
const start_0 = val_10[1];
const end_0 = val_10[2];
const {
args: _key_35,
...rex_0
} = drec_2;
let ret_3;
ret_3: {
/* istanbul ignore else */
if (null != [start_0, end_0]) {
/* istanbul ignore else */
if (start_0 === args_3.c + 1) {
/* istanbul ignore else */
if (end_0 === 0) {
const slc_0 = ident_0(args_id_1);
const next_ctx_1 = set_js2_0(expr_0, slc_0, ctx_1);
ret_3 = [[], next_ctx_1];
/* istanbul ignore next */
break ret_3;
}
}
}
ret_3 = [[[{ ...rex_0,
args: [args_id_1, start_0 - args_3.c - 1, end_0]
}, expr_0[1]]], ctx_1];
/* istanbul ignore next */
break ret_3;
}
const dlst_4 = ret_3;
args_2 = [tail_5, args_id_1, dlst_4[1], { ...args_3,
foo: true
}, [...body_1, ...dlst_4[0]]];
continue split_args_body_0;
}
}
}
}
}
}
/* istanbul ignore else */
if (null != expr_0) {
const itm_2 = expr_0[0];
/* istanbul ignore else */
if (null != itm_2) {
/* istanbul ignore else */
if (true === _in_(itm_2.f, [`fn`, `cn`])) {
const foo_0 = expr_0[0];
const val_6 = foo_0.args;
const dlst_2 = split_args_body_0(val_6[1], args_id_0, ctx_1, args_3);
args_2 = [tail_5, args_id_0, dlst_2[2], dlst_2[0], [...body_1, [{ ...foo_0,
args: [val_6[0], dlst_2[1]]
}, expr_0[1]]]];
continue split_args_body_0;
}
}
}
args_2 = [tail_5, args_id_0, ctx_1, args_3, [...body_1, expr_0]];
continue split_args_body_0;
} while (true);
};
const transform_normal_fn_0 = (expr_1, ctx_2) => {
const val_24 = expr_1[0].args;
const fn_args_0 = val_24[0];
const res_id_0 = expr_1[1][0];
const args_id_2 = fn_args_0[0];
const hdm_4 = fn_args_0[2];
const self_id_0 = undefined === hdm_4 ? false : hdm_4;
const sprd_7 = returnStatement_0();
const self_ctx_0 = set_js_0(fn_args_0[1], { ...sprd_7,
leadingComments: [{
type: `CommentBlock`,
value: ` istanbul ignore next `
}]
}, ctx_2);
let ret_10;
ret_10: {
/* istanbul ignore else */
if (self_id_0 === false) {
ret_10 = self_ctx_0;
/* istanbul ignore next */
break ret_10;
}
const ppr_2 = (prtl_2 => {
const arg_56 = ident_0(res_id_0);
const pfn_5 = set_js_0(self_id_0, arg_56, prtl_2);
return pfn_5;
})(self_ctx_0);
const ppr_3 = (prtl_3 => {
const pfn_7 = update_value_0(self_id_0, {
ignore_refs: true
}, prtl_3);
return pfn_7;
})(ppr_2);
const ppr_4 = (prtl_4 => {
const pfn_9 = update_value_0(res_id_0, {
inline: false
}, prtl_4);
return pfn_9;
})(ppr_3);
ret_10 = ppr_4;
/* istanbul ignore next */
break ret_10;
}
const body_ctx_0 = ret_10;
const ppr_5 = (prtl_5 => {
const pfn_11 = split_args_body_0(val_24[1], args_id_2, prtl_5);
return pfn_11;
})(body_ctx_0);
const ppr_6 = (prtl_6 => {
const pfn_13 = clean_args_0(...prtl_6);
return pfn_13;
})(ppr_5);
const args_26 = ppr_6[0];
const fn_ctx_0 = ppr_6[2];
const value_6 = get_refs_0(args_id_2, fn_ctx_0);
let ret_16;
ret_16: {
/* istanbul ignore else */
if (true === value_6 > 0) {
const arg_66 = ident_0(args_id_2);
const item_36 = restElement_0(arg_66);
ret_16 = [...args_26, item_36];
/* istanbul ignore next */
break ret_16;
}
ret_16 = args_26;
/* istanbul ignore next */
break ret_16;
}
const all_args_0 = ret_16;
const dlst_12 = transform_exprs_0(ppr_6[1], fn_ctx_0);
const arg_71 = blockStatement_0(dlst_12[0]);
const js_0 = arrowFunctionExpression_0(all_args_0, arg_71);
const result_44 = set_js2_0(expr_1, js_0, dlst_12[1]);
return result_44;
};
const transform_tco_fn_0 = (expr_2, ctx_3) => {
const val_32 = expr_2[0].args;
const fn_args_1 = val_32[0];
const res_id_1 = expr_2[1][0];
const args_id_3 = fn_args_1[0];
const self_id_1 = fn_args_1[2];
const sprd_9 = returnStatement_0();
const ppr_7 = (prtl_7 => {
const pfn_15 = set_js_0(fn_args_1[1], { ...sprd_9,
leadingComments: [{
type: `CommentBlock`,
value: ` istanbul ignore next `
}]
}, prtl_7);
return pfn_15;
})(ctx_3);
const ppr_8 = (prtl_8 => {
const arg_79 = ident_0(res_id_1);
const pfn_17 = set_js_0(self_id_1, arg_79, prtl_8);
return pfn_17;
})(ppr_7);
const ppr_9 = (prtl_9 => {
const pfn_19 = update_value_0(self_id_1, {
args_id: args_id_3,
label_id: res_id_1,
ignore_refs: true
}, prtl_9);
return pfn_19;
})(ppr_8);
const dlst_16 = transform_exprs_0(val_32[1], ppr_9);
const arg_86 = ident_0(args_id_3);
const item_38 = restElement_0(arg_86);
const arg_90 = ident_0(res_id_1);
const arg_93 = types_0.booleanLiteral(true);
const arg_95 = blockStatement_0(dlst_16[0]);
const arg_92 = types_0.doWhileStatement(arg_93, arg_95);
const item_39 = labeledStatement_0(arg_90, arg_92);
const arg_88 = blockStatement_0([item_39]);
const js_1 = arrowFunctionExpression_0([item_38], arg_88);
const result_51 = set_js2_0(expr_2, js_1, dlst_16[1]);
return result_51;
};
const transform_fn_0 = (expr_3, ctx_4) => {
/* istanbul ignore else */
if (null != expr_3) {
const itm_17 = expr_3[0];
/* istanbul ignore else */
if (null != itm_17) {
/* istanbul ignore else */
if (itm_17.tco === true) {
const result_54 = transform_tco_fn_0(expr_3, ctx_4);
return result_54;
}
}
}
const result_53 = transform_normal_fn_0(expr_3, ctx_4);
return result_53;
};
const transform_cont_0 = (expr_4, ctx_5) => {
const val_40 = expr_4[0].args;
const hdm_5 = val_40[0][0];
const ret_id_2 = undefined === hdm_5 ? false : hdm_5;
const dlst_19 = transform_exprs_0(val_40[1], ctx_5);
const body_4 = dlst_19[0];
let ret_25;
ret_25: {
/* istanbul ignore else */
if (ret_id_2 === false) {
const result_60 = blockStatement_0(body_4);
ret_25 = result_60;
/* istanbul ignore next */
break ret_25;
}
const arg_106 = ident_0(ret_id_2);
const arg_108 = blockStatement_0(body_4);
const result_59 = labeledStatement_0(arg_106, arg_108);
ret_25 = result_59;
/* istanbul ignore next */
break ret_25;
}
const js_2 = ret_25;
const result_61 = set_js2_0(expr_4, js_2, dlst_19[1]);
return result_61;
};
const add_funcs_0 = ctx_6 => {
const pfn_20 = add_0(`fn`, transform_fn_0);
const ppr_10 = pfn_20(ctx_6);
const pfn_21 = add_0(`cn`, transform_cont_0);
const ppr_11 = pfn_21(ppr_10);
return ppr_11;
};
exports.clean_args = clean_args_0;
exports.split_args_body = split_args_body_0;
exports.transform_normal_fn = transform_normal_fn_0;
exports.transform_tco_fn = transform_tco_fn_0;
exports.transform_fn = transform_fn_0;
exports.transform_cont = transform_cont_0;
exports.add_funcs = add_funcs_0;