@fink/larix
Version:
A parser for generating fink's AST.
213 lines (180 loc) • 4.16 kB
JavaScript
import { map, flatten, chain } from "@fink/std-lib/iter.js";
export const get_child_exprs = expr => {
const ˆvalue_1 = expr;
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_3,
args: ˆp_4
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_3 === `block`)
/* istanbul ignore else */
if (typeof ˆp_4?.[Symbol.iterator] === "function") {
return [...expr.args, ...expr.exprs];
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_5
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_5 === `block`) {
return expr.exprs;
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_6
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_6 === `call`) {
return [expr.callee, ...expr.args];
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_7,
tag: ˆp_8
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_7 === `string`)
/* istanbul ignore else */
if (ˆp_8 !== false) {
return [expr.tag, ...expr.exprs];
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_9
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_9 === `jsx:elem`) {
return [expr.name, ...expr.props, ...expr.children];
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_10
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_10 === `jsx:frag`) {
return expr.children;
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_11,
value: ˆp_12
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_11 === `jsx:attr`)
/* istanbul ignore else */
if (ˆp_12 === false) {
return [expr.name];
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_13
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_13 === `jsx:attr`) {
return [expr.name, expr.value];
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_14
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_14 === `jsx:expr`) {
return [expr.expr];
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_15,
right: ˆp_16
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_15 === `rec:kv`)
/* istanbul ignore else */
if (ˆp_16 === false) {
return [expr.left];
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
type: ˆp_17,
right: ˆp_18
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_17 === `spread`)
/* istanbul ignore else */
if (ˆp_18 === false) {
return [];
}
}
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
left: ˆp_19,
right: ˆp_20
} = ˆvalue_1;
/* istanbul ignore else */
if (ˆp_19 != null)
/* istanbul ignore else */
if (ˆp_20 != null) {
return [expr.left, expr.right];
}
}
// spread, await
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
right: ˆp_21
} = ˆvalue_1;
// spread, await
/* istanbul ignore else */
if (ˆp_21 != null) {
return [expr.right];
}
}
// {left: {}}:
// [expr.left]
/* istanbul ignore else */
if (ˆvalue_1 != null) {
const {
exprs: ˆp_22
} = ˆvalue_1;
// {left: {}}:
// [expr.left]
/* istanbul ignore else */
if (typeof ˆp_22?.[Symbol.iterator] === "function") {
return expr.exprs;
}
}
{
return [];
}
};
export const walk = (exprs, parent = false) => {
let ˆpipe_result_23 = exprs;
ˆpipe_result_23 = map(expr => {
const children = get_child_exprs(expr);
return chain(walk(children, expr))([[expr, parent]]);
})(ˆpipe_result_23);
return ˆpipe_result_23 = flatten(ˆpipe_result_23);
};
export const walk_expr = expr => walk([expr]);