@fink/loxia
Version:
A fink to JavaScript compiler.
887 lines (776 loc) • 24.2 kB
JavaScript
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;