UNPKG

@fink/loxia

Version:

A fink to JavaScript compiler.

887 lines (776 loc) 24.2 kB
const { _in_ } = require("@fink/js-interop/runtime.js"); const { update_value: update_value_0 } = require("../ir/context.js"); const { init_ctx: init_ctx_0 } = require("../ir/context.js"); const { get_value: get_value_0 } = require("../ir/context.js"); const get_type_0 = (id_0, ctx_0) => { const drec_0 = get_value_0(id_0, ctx_0); const hdm_0 = drec_0.t; return undefined === hdm_0 ? { t: `???` } : hdm_0; }; const set_type_0 = (id_1, t_1, ctx_1) => { const result_2 = update_value_0(id_1, { t: t_1 }, ctx_1); return result_2; }; const get_ret_type_0 = (id_2, ctx_2) => { const drec_1 = get_type_0(id_2, ctx_2); return drec_1.r; }; const get_items_types_0 = (id_3, ctx_3) => { const drec_2 = get_type_0(id_3, ctx_3); return drec_2.i; }; const get_kv_types_0 = (id_4, ctx_4) => { const drec_3 = get_type_0(id_4, ctx_4); return drec_3.e; }; const t_bool_0 = v_0 => { return { t: `bool`, v: v_0 }; }; const t_float_0 = v_1 => { return { t: `float`, v: v_1 }; }; const t_int_0 = v_2 => { return { t: `int`, v: v_2 }; }; const t_num_0 = (l_t_0, r_t_0) => { const item_1 = l_t_0.t; const item_0 = r_t_0.t; const value_0 = [item_1, item_0]; /* istanbul ignore else */ if (null != value_0) { /* istanbul ignore else */ if (item_1 === `int`) { /* istanbul ignore else */ if (item_0 === `int`) { const result_16 = t_int_0(); return result_16; } } } /* istanbul ignore else */ if (null != value_0) { /* istanbul ignore else */ if (item_0 === `float`) { const result_15 = t_float_0(); return result_15; } } /* istanbul ignore else */ if (null != value_0) { /* istanbul ignore else */ if (item_1 === `float`) { const result_14 = t_float_0(); return result_14; } } return { t: `int|float` }; }; const t_str_0 = v_3 => { return { t: `str`, v: v_3 }; }; const t_strt_0 = () => { return { t: `str` }; }; const t_tpl_0 = i_1 => { return { t: `tpl`, i: i_1 }; }; const t_lst_0 = i_2 => { return { t: `lst`, i: i_2 }; }; const t_spread_iter_0 = () => { return { t: `...` }; }; const t_rec_0 = e_1 => { return { t: `rec`, e: e_1 }; }; const t_hmap_0 = e_2 => { return { t: `hmap`, e: e_2 }; }; const t_fn_0 = r_1 => { return { t: `fn`, r: r_1 }; }; const infer_all_types_0 = (...args_17) => { infer_all_types_0: do { const dlst_0 = args_17[0]; const hdm_1 = dlst_0[0]; const curr_0 = undefined === hdm_1 ? false : hdm_1; const tail_28 = dlst_0.slice(1); const ctx_5 = args_17[1]; const hdm_2 = args_17[2]; const out_0 = undefined === hdm_2 ? [] : hdm_2; /* istanbul ignore else */ if (curr_0 === false) { return [out_0, ctx_5]; } /* istanbul ignore else */ if (null != curr_0) { const itm_58 = curr_0[0]; /* istanbul ignore else */ if (null != itm_58) { /* istanbul ignore else */ if (itm_58.f === `=`) { const expr_20 = curr_0[0]; const res_id_19 = curr_0[1][0]; const t_23 = get_type_0(expr_20.args[0], ctx_5); const next_ctx_20 = set_type_0(res_id_19, t_23, ctx_5); args_17 = [tail_28, next_ctx_20, [...out_0, [expr_20, [{ ...res_id_19, t: t_23 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_56 = curr_0[0]; /* istanbul ignore else */ if (null != itm_56) { /* istanbul ignore else */ if (true === _in_(itm_56.f, [`bool`, `int`, `float`])) { const expr_19 = curr_0[0]; const res_id_18 = curr_0[1][0]; const t_22 = { t: expr_19.f }; const next_ctx_19 = set_type_0(res_id_18, t_22, ctx_5); args_17 = [tail_28, next_ctx_19, [...out_0, [expr_19, [{ ...res_id_18, t: t_22 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_54 = curr_0[0]; /* istanbul ignore else */ if (null != itm_54) { /* istanbul ignore else */ if (itm_54.f === `str`) { const expr_18 = curr_0[0]; const res_id_17 = curr_0[1][0]; const t_21 = t_str_0(expr_18.args[0]); const next_ctx_18 = set_type_0(res_id_17, t_21, ctx_5); args_17 = [tail_28, next_ctx_18, [...out_0, [expr_18, [{ ...res_id_17, t: t_21 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_52 = curr_0[0]; /* istanbul ignore else */ if (null != itm_52) { /* istanbul ignore else */ if (itm_52.f === `strt`) { const res_id_16 = curr_0[1][0]; const t_20 = t_strt_0(); const next_ctx_17 = set_type_0(res_id_16, t_20, ctx_5); args_17 = [tail_28, next_ctx_17, [...out_0, [curr_0[0], [{ ...res_id_16, t: t_20 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_50 = curr_0[0]; /* istanbul ignore else */ if (null != itm_50) { /* istanbul ignore else */ if (itm_50.f === `strtt`) { const expr_16 = curr_0[0]; const res_id_15 = curr_0[1][0]; const t_19 = get_ret_type_0(expr_16.args[0], ctx_5); const next_ctx_16 = set_type_0(res_id_15, t_19, ctx_5); args_17 = [tail_28, next_ctx_16, [...out_0, [expr_16, [{ ...res_id_15, t: t_19 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_48 = curr_0[0]; /* istanbul ignore else */ if (null != itm_48) { /* istanbul ignore else */ if (true === _in_(itm_48.f, [`+`, `-`, `*`, `^`, `%`])) { const expr_15 = curr_0[0]; const res_id_14 = curr_0[1][0]; const val_84 = expr_15.args; const lt_0 = get_type_0(val_84[0], ctx_5); const rt_0 = get_type_0(val_84[1], ctx_5); const t_18 = t_num_0(lt_0, rt_0); const next_ctx_15 = set_type_0(res_id_14, t_18, ctx_5); args_17 = [tail_28, next_ctx_15, [...out_0, [expr_15, [{ ...res_id_14, t: t_18 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_46 = curr_0[0]; /* istanbul ignore else */ if (null != itm_46) { /* istanbul ignore else */ if (true === _in_(itm_46.f, `/`)) { const res_id_13 = curr_0[1][0]; const t_17 = t_float_0(); const next_ctx_14 = set_type_0(res_id_13, t_17, ctx_5); args_17 = [tail_28, next_ctx_14, [...out_0, [curr_0[0], [{ ...res_id_13, t: t_17 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_44 = curr_0[0]; /* istanbul ignore else */ if (null != itm_44) { /* istanbul ignore else */ if (true === _in_(itm_44.f, [`==`, `>`, `<`, `!=`, `>=`, `<=`, `in`, `and`, `or`, `not`])) { const res_id_12 = curr_0[1][0]; const t_16 = t_bool_0(); const next_ctx_13 = set_type_0(res_id_12, t_16, ctx_5); args_17 = [tail_28, next_ctx_13, [...out_0, [curr_0[0], [{ ...res_id_12, t: t_16 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_42 = curr_0[0]; /* istanbul ignore else */ if (null != itm_42) { /* istanbul ignore else */ if (itm_42.f === `lst`) { const res_id_11 = curr_0[1][0]; const t_15 = t_tpl_0([]); const next_ctx_12 = set_type_0(res_id_11, t_15, ctx_5); args_17 = [tail_28, next_ctx_12, [...out_0, [curr_0[0], [{ ...res_id_11, t: t_15 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_39 = curr_0[0]; /* istanbul ignore else */ if (null != itm_39) { /* istanbul ignore else */ if (itm_39.f === `lst_a`) { const expr_11 = curr_0[0]; const res_id_10 = curr_0[1][0]; const val_74 = expr_11.args; const lst_id_2 = val_74[0]; const lst_t_2 = get_type_0(lst_id_2, ctx_5); const item_t_0 = get_type_0(val_74[1], ctx_5); const items_ts_1 = get_items_types_0(lst_id_2, ctx_5); let ret_27; ret_27: { /* istanbul ignore else */ if (null != lst_t_2) { /* istanbul ignore else */ if (lst_t_2.t === `tpl`) { const result_121 = t_tpl_0([...items_ts_1, item_t_0]); ret_27 = result_121; /* istanbul ignore next */ break ret_27; } } const result_120 = t_lst_0([...items_ts_1, item_t_0]); ret_27 = result_120; /* istanbul ignore next */ break ret_27; } const t_14 = ret_27; const next_ctx_11 = set_type_0(res_id_10, t_14, ctx_5); args_17 = [tail_28, next_ctx_11, [...out_0, [expr_11, [{ ...res_id_10, t: t_14 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_36 = curr_0[0]; /* istanbul ignore else */ if (null != itm_36) { /* istanbul ignore else */ if (itm_36.f === `lst_t`) { const expr_10 = curr_0[0]; const res_id_9 = curr_0[1][0]; const lst_id_1 = expr_10.args[0]; const lst_t_1 = get_type_0(lst_id_1, ctx_5); let ret_26; ret_26: { /* istanbul ignore else */ if (null != lst_t_1) { /* istanbul ignore else */ if (lst_t_1.t === `tpl`) { const dlst_25 = get_items_types_0(lst_id_1, ctx_5); const result_111 = t_tpl_0(dlst_25.slice(1)); ret_26 = result_111; /* istanbul ignore next */ break ret_26; } } const result_109 = t_lst_0([]); ret_26 = result_109; /* istanbul ignore next */ break ret_26; } const t_13 = ret_26; const next_ctx_10 = set_type_0(res_id_9, t_13, ctx_5); args_17 = [tail_28, next_ctx_10, [...out_0, [expr_10, [{ ...res_id_9, t: t_13 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_33 = curr_0[0]; /* istanbul ignore else */ if (null != itm_33) { /* istanbul ignore else */ if (itm_33.f === `lst_h`) { const expr_9 = curr_0[0]; const res_id_8 = curr_0[1][0]; const lst_id_0 = expr_9.args[0]; const lst_t_0 = get_type_0(lst_id_0, ctx_5); let ret_25; ret_25: { /* istanbul ignore else */ if (null != lst_t_0) { /* istanbul ignore else */ if (lst_t_0.t === `tpl`) { const dlst_22 = get_items_types_0(lst_id_0, ctx_5); ret_25 = dlst_22[0]; /* istanbul ignore next */ break ret_25; } } ret_25 = { t: `???` }; /* istanbul ignore next */ break ret_25; } const t_11 = ret_25; const next_ctx_9 = set_type_0(res_id_8, t_11, ctx_5); args_17 = [tail_28, next_ctx_9, [...out_0, [expr_9, [{ ...res_id_8, t: t_11 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_26 = curr_0[0]; /* istanbul ignore else */ if (null != itm_26) { /* istanbul ignore else */ if (itm_26.f === `lst_c`) { const expr_8 = curr_0[0]; const res_id_7 = curr_0[1][0]; const val_58 = expr_8.args; const l1_id_0 = val_58[0]; const l2_id_0 = val_58[1]; const l1_t_0 = get_type_0(l1_id_0, ctx_5); const l2_t_0 = get_type_0(l2_id_0, ctx_5); const l1_it_0 = get_items_types_0(l1_id_0, ctx_5); const l2_it_0 = get_items_types_0(l2_id_0, ctx_5); const item_43 = l1_t_0.t; const item_42 = l2_t_0.t; const value_4 = [item_43, item_42]; let ret_24; ret_24: { /* istanbul ignore else */ if (null != value_4) { /* istanbul ignore else */ if (item_43 === `tpl`) { /* istanbul ignore else */ if (item_42 === `tpl`) { const result_93 = t_tpl_0([...l1_it_0, ...l2_it_0]); ret_24 = result_93; /* istanbul ignore next */ break ret_24; } } } /* istanbul ignore else */ if (null != value_4) { /* istanbul ignore else */ if (item_43 === `tpl`) { const item_46 = t_spread_iter_0(); const result_92 = t_lst_0([...l1_it_0, item_46]); ret_24 = result_92; /* istanbul ignore next */ break ret_24; } } /* istanbul ignore else */ if (null != value_4) { /* istanbul ignore else */ if (undefined !== item_43) { /* istanbul ignore else */ if (item_42 === `tpl`) { const item_45 = t_spread_iter_0(); const result_91 = t_lst_0([item_45, ...l2_it_0]); ret_24 = result_91; /* istanbul ignore next */ break ret_24; } } } const item_44 = t_spread_iter_0(); const result_90 = t_lst_0([item_44]); ret_24 = result_90; /* istanbul ignore next */ break ret_24; } const t_10 = ret_24; const next_ctx_8 = set_type_0(res_id_7, t_10, ctx_5); args_17 = [tail_28, next_ctx_8, [...out_0, [expr_8, [{ ...res_id_7, t: t_10 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_24 = curr_0[0]; /* istanbul ignore else */ if (null != itm_24) { /* istanbul ignore else */ if (itm_24.f === `rec`) { const res_id_6 = curr_0[1][0]; const t_9 = t_rec_0({}); const next_ctx_7 = set_type_0(res_id_6, t_9, ctx_5); args_17 = [tail_28, next_ctx_7, [...out_0, [curr_0[0], [{ ...res_id_6, t: t_9 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_18 = curr_0[0]; /* istanbul ignore else */ if (null != itm_18) { /* istanbul ignore else */ if (itm_18.f === `rec_s`) { const expr_6 = curr_0[0]; const res_id_5 = curr_0[1][0]; const val_51 = expr_6.args; const rec_id_1 = val_51[0]; const rec_t_0 = get_type_0(rec_id_1, ctx_5); const key_t_1 = get_type_0(val_51[1], ctx_5); const val_t_0 = get_type_0(val_51[2], ctx_5); const kv_ts_0 = get_kv_types_0(rec_id_1, ctx_5); let ret_23; ret_23: { /* istanbul ignore else */ if (null != [rec_t_0, key_t_1]) { /* istanbul ignore else */ if (null != rec_t_0) { /* istanbul ignore else */ if (rec_t_0.t === `rec`) { /* istanbul ignore else */ if (null != key_t_1) { /* istanbul ignore else */ if (undefined !== key_t_1.v) { const result_76 = t_rec_0({ ...kv_ts_0, [key_t_1.v]: val_t_0 }); ret_23 = result_76; /* istanbul ignore next */ break ret_23; } } } } } const result_75 = t_hmap_0({}); ret_23 = result_75; /* istanbul ignore next */ break ret_23; } const t_8 = ret_23; const next_ctx_6 = set_type_0(res_id_5, t_8, ctx_5); args_17 = [tail_28, next_ctx_6, [...out_0, [expr_6, [{ ...res_id_5, t: t_8 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_14 = curr_0[0]; /* istanbul ignore else */ if (null != itm_14) { /* istanbul ignore else */ if (itm_14.f === `rec_m`) { const expr_5 = curr_0[0]; const res_id_4 = curr_0[1][0]; const val_46 = expr_5.args; const rec1_id_0 = val_46[0]; const rec2_id_0 = val_46[1]; const rec1_t_0 = get_type_0(rec1_id_0, ctx_5); const rec2_t_0 = get_type_0(rec2_id_0, ctx_5); const kv1_ts_0 = get_kv_types_0(rec1_id_0, ctx_5); const kv2_ts_0 = get_kv_types_0(rec2_id_0, ctx_5); const item_27 = rec1_t_0.t; const item_26 = rec2_t_0.t; let ret_22; ret_22: { /* istanbul ignore else */ if (null != [item_27, item_26]) { /* istanbul ignore else */ if (item_27 === `rec`) { /* istanbul ignore else */ if (item_26 === `rec`) { const result_65 = t_rec_0({ ...kv1_ts_0, ...kv2_ts_0 }); ret_22 = result_65; /* istanbul ignore next */ break ret_22; } } } const result_64 = t_hmap_0({}); ret_22 = result_64; /* istanbul ignore next */ break ret_22; } const t_7 = ret_22; const next_ctx_5 = set_type_0(res_id_4, t_7, ctx_5); args_17 = [tail_28, next_ctx_5, [...out_0, [expr_5, [{ ...res_id_4, t: t_7 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_12 = curr_0[0]; /* istanbul ignore else */ if (null != itm_12) { /* istanbul ignore else */ if (itm_12.f === `rec_g`) { const expr_4 = curr_0[0]; const res_id_3 = curr_0[1][0]; const val_43 = expr_4.args; const key_t_0 = get_type_0(val_43[1], ctx_5); const drec_8 = get_kv_types_0(val_43[0], ctx_5); const t_6 = drec_8[key_t_0.v]; const next_ctx_4 = set_type_0(res_id_3, t_6, ctx_5); args_17 = [tail_28, next_ctx_4, [...out_0, [expr_4, [{ ...res_id_3, t: t_6 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_10 = curr_0[0]; /* istanbul ignore else */ if (null != itm_10) { /* istanbul ignore else */ if (itm_10.f === `fn`) { const expr_3 = curr_0[0]; const res_id_2 = curr_0[1][0]; const val_36 = expr_3.args; const dlst_8 = val_36[0]; const args_id_0 = dlst_8[0]; const ret_id_1 = dlst_8[1]; const ret_t_0 = { t: `cn` }; const args_t_0 = t_tpl_0([]); const ppr_0 = (prtl_0 => { const pfn_1 = set_type_0(args_id_0, args_t_0, prtl_0); return pfn_1; })(ctx_5); const ppr_1 = (prtl_1 => { const pfn_3 = set_type_0(ret_id_1, ret_t_0, prtl_1); return pfn_3; })(ppr_0); const ppr_2 = (prtl_2 => { const arg_42 = t_fn_0(); const pfn_5 = set_type_0(res_id_2, arg_42, prtl_2); return pfn_5; })(ppr_1); const dlst_9 = infer_all_types_0(val_36[1], ppr_2); const fn_ctx_0 = dlst_9[1]; const arg_45 = get_type_0(ret_id_1, fn_ctx_0); const t_5 = t_fn_0(arg_45); const next_ctx_3 = set_type_0(res_id_2, t_5, fn_ctx_0); args_17 = [tail_28, next_ctx_3, [...out_0, [{ ...expr_3, args: [[{ ...args_id_0, t: args_t_0 }, { ...ret_id_1, t: ret_t_0 }], dlst_9[0]] }, [{ ...res_id_2, t: t_5 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_8 = curr_0[0]; /* istanbul ignore else */ if (null != itm_8) { /* istanbul ignore else */ if (itm_8.f === `cc`) { const expr_2 = curr_0[0]; const val_34 = expr_2.args; const t_4 = get_type_0(val_34[1], ctx_5); const next_ctx_2 = set_type_0(val_34[0], t_4, ctx_5); args_17 = [tail_28, next_ctx_2, [...out_0, [expr_2, curr_0[1]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_6 = curr_0[0]; /* istanbul ignore else */ if (null != itm_6) { /* istanbul ignore else */ if (itm_6.f === `af`) { const expr_1 = curr_0[0]; const res_id_1 = curr_0[1][0]; const t_3 = get_ret_type_0(expr_1.args[0], ctx_5); const next_ctx_1 = set_type_0(res_id_1, t_3, ctx_5); args_17 = [tail_28, next_ctx_1, [...out_0, [expr_1, [{ ...res_id_1, t: t_3 }]]]]; continue infer_all_types_0; } } } /* istanbul ignore else */ if (null != curr_0) { const itm_4 = curr_0[0]; /* istanbul ignore else */ if (null != itm_4) { /* istanbul ignore else */ if (itm_4.f === `mod`) { const res_id_0 = curr_0[1][0]; const t_2 = { t: `mod` }; const next_ctx_0 = set_type_0(res_id_0, t_2, ctx_5); args_17 = [tail_28, next_ctx_0, [...out_0, [curr_0[0], [{ ...res_id_0, t: t_2 }]]]]; continue infer_all_types_0; } } } args_17 = [tail_28, ctx_5, [...out_0, curr_0]]; continue infer_all_types_0; } while (true); }; const infer_types_0 = (exprs_1, options_0) => { const ppr_3 = (prtl_3 => { const pfn_7 = init_ctx_0(prtl_3, options_0); return pfn_7; })(exprs_1); const ppr_4 = (prtl_4 => { const pfn_9 = infer_all_types_0(exprs_1, prtl_4); return pfn_9; })(ppr_3); return ppr_4; }; exports.get_type = get_type_0; exports.set_type = set_type_0; exports.get_ret_type = get_ret_type_0; exports.get_items_types = get_items_types_0; exports.get_kv_types = get_kv_types_0; exports.t_bool = t_bool_0; exports.t_float = t_float_0; exports.t_int = t_int_0; exports.t_num = t_num_0; exports.t_str = t_str_0; exports.t_strt = t_strt_0; exports.t_tpl = t_tpl_0; exports.t_lst = t_lst_0; exports.t_spread_iter = t_spread_iter_0; exports.t_rec = t_rec_0; exports.t_hmap = t_hmap_0; exports.t_fn = t_fn_0; exports.infer_all_types = infer_all_types_0; exports.infer_types = infer_types_0;