vyre-libs 0.6.2

vyre Category A library ecosystem - pure-IR compositions over vyre-ops hardware primitives
Documentation
use super::*;

pub(super) fn extend(
    out: &mut Vec<Node>,
    vast_nodes: &str,
    _out_typed_vast_nodes: &str,
    num_nodes: Expr,
    _t: Expr,
    _base: Expr,
) {
    out.extend(vec![
        Node::if_then(
            Expr::or(Expr::var("identifier_then_paren"), Expr::var("raw_lparen")),
            vec![
                Node::let_bind(
                    "suffix_start_idx",
                    Expr::select(
                        Expr::var("identifier_then_paren"),
                        Expr::var("after_param_idx"),
                        Expr::var("next_idx"),
                    ),
                ),
                Node::let_bind("suffix_scan_idx", Expr::var("after_param_idx")),
                Node::assign("suffix_scan_idx", Expr::var("suffix_start_idx")),
                Node::loop_for(
                    "suffix_scan_step",
                    Expr::u32(0),
                    Expr::u32(16),
                    vec![Node::if_then(
                        Expr::and(
                            Expr::lt(Expr::var("suffix_scan_idx"), num_nodes.clone()),
                            Expr::eq(Expr::var("suffix_boundary"), Expr::u32(0)),
                        ),
                        vec![
                            Node::let_bind(
                                "suffix_scan_base",
                                Expr::mul(
                                    Expr::var("suffix_scan_idx"),
                                    Expr::u32(VAST_NODE_STRIDE_U32),
                                ),
                            ),
                            Node::let_bind(
                                "suffix_scan_kind",
                                Expr::load(vast_nodes, Expr::var("suffix_scan_base")),
                            ),
                            Node::if_then(
                                Expr::eq(
                                    Expr::var("suffix_scan_kind"),
                                    Expr::u32(TOK_GNU_ATTRIBUTE),
                                ),
                                vec![Node::assign("suffix_has_gnu_attribute", Expr::u32(1))],
                            ),
                            Node::if_then(
                                Expr::or(
                                    Expr::eq(Expr::var("suffix_scan_kind"), Expr::u32(TOK_LBRACE)),
                                    Expr::eq(
                                        Expr::var("suffix_scan_kind"),
                                        Expr::u32(TOK_SEMICOLON),
                                    ),
                                ),
                                vec![
                                    Node::assign("suffix_boundary", Expr::u32(1)),
                                    Node::assign(
                                        "suffix_boundary_kind",
                                        Expr::var("suffix_scan_kind"),
                                    ),
                                ],
                            ),
                            Node::if_then(
                                Expr::eq(Expr::var("suffix_scan_kind"), Expr::u32(TOK_RPAREN)),
                                vec![
                                    Node::let_bind(
                                        "suffix_scan_parent",
                                        Expr::load(
                                            vast_nodes,
                                            Expr::add(Expr::var("suffix_scan_base"), Expr::u32(1)),
                                        ),
                                    ),
                                    Node::if_then(
                                        Expr::lt(
                                            Expr::var("suffix_scan_parent"),
                                            num_nodes.clone(),
                                        ),
                                        vec![
                                            Node::let_bind(
                                                "suffix_parent_base",
                                                Expr::mul(
                                                    Expr::var("suffix_scan_parent"),
                                                    Expr::u32(VAST_NODE_STRIDE_U32),
                                                ),
                                            ),
                                            Node::let_bind(
                                                "suffix_parent_next",
                                                Expr::load(
                                                    vast_nodes,
                                                    Expr::add(
                                                        Expr::var("suffix_parent_base"),
                                                        Expr::u32(3),
                                                    ),
                                                ),
                                            ),
                                            Node::if_then(
                                                Expr::lt(
                                                    Expr::var("suffix_parent_next"),
                                                    num_nodes.clone(),
                                                ),
                                                vec![
                                                    Node::let_bind(
                                                        "suffix_parent_next_kind",
                                                        Expr::load(
                                                            vast_nodes,
                                                            Expr::mul(
                                                                Expr::var("suffix_parent_next"),
                                                                Expr::u32(VAST_NODE_STRIDE_U32),
                                                            ),
                                                        ),
                                                    ),
                                                    Node::if_then(
                                                        any_token_eq(
                                                            Expr::var("suffix_parent_next_kind"),
                                                            &[
                                                                TOK_LPAREN,
                                                                TOK_LBRACKET,
                                                                TOK_SEMICOLON,
                                                            ],
                                                        ),
                                                        vec![
                                                            Node::assign(
                                                                "suffix_boundary",
                                                                Expr::u32(1),
                                                            ),
                                                            Node::assign(
                                                                "suffix_boundary_kind",
                                                                Expr::var(
                                                                    "suffix_parent_next_kind",
                                                                ),
                                                            ),
                                                        ],
                                                    ),
                                                    Node::if_then(
                                                        Expr::and(
                                                            Expr::eq(
                                                                Expr::var(
                                                                    "suffix_parent_next_kind",
                                                                ),
                                                                Expr::u32(TOK_RPAREN),
                                                            ),
                                                            Expr::eq(
                                                                Expr::var("suffix_boundary"),
                                                                Expr::u32(0),
                                                            ),
                                                        ),
                                                        vec![
                                                            Node::let_bind(
                                                                "suffix_parent_next_base",
                                                                Expr::mul(
                                                                    Expr::var(
                                                                        "suffix_parent_next",
                                                                    ),
                                                                    Expr::u32(
                                                                        VAST_NODE_STRIDE_U32,
                                                                    ),
                                                                ),
                                                            ),
                                                            Node::let_bind(
                                                                "suffix_parent_next_parent",
                                                                Expr::load(
                                                                    vast_nodes,
                                                                    Expr::add(
                                                                        Expr::var(
                                                                            "suffix_parent_next_base",
                                                                        ),
                                                                        Expr::u32(1),
                                                                    ),
                                                                ),
                                                            ),
                                                            Node::if_then(
                                                                Expr::lt(
                                                                    Expr::var(
                                                                        "suffix_parent_next_parent",
                                                                    ),
                                                                    num_nodes.clone(),
                                                                ),
                                                                vec![
                                                                    Node::let_bind(
                                                                        "suffix_parent_next_parent_base",
                                                                        Expr::mul(
                                                                            Expr::var(
                                                                                "suffix_parent_next_parent",
                                                                            ),
                                                                            Expr::u32(
                                                                                VAST_NODE_STRIDE_U32,
                                                                            ),
                                                                        ),
                                                                    ),
                                                                    Node::let_bind(
                                                                        "suffix_parent_next_parent_next",
                                                                        Expr::load(
                                                                            vast_nodes,
                                                                            Expr::add(
                                                                                Expr::var(
                                                                                    "suffix_parent_next_parent_base",
                                                                                ),
                                                                                Expr::u32(3),
                                                                            ),
                                                                        ),
                                                                    ),
                                                                    Node::if_then(
                                                                        Expr::lt(
                                                                            Expr::var(
                                                                                "suffix_parent_next_parent_next",
                                                                            ),
                                                                            num_nodes.clone(),
                                                                        ),
                                                                        vec![
                                                                            Node::let_bind(
                                                                                "suffix_parent_next_parent_next_kind",
                                                                                Expr::load(
                                                                                    vast_nodes,
                                                                                    Expr::mul(
                                                                                        Expr::var(
                                                                                            "suffix_parent_next_parent_next",
                                                                                        ),
                                                                                        Expr::u32(
                                                                                            VAST_NODE_STRIDE_U32,
                                                                                        ),
                                                                                    ),
                                                                                ),
                                                                            ),
                                                                            Node::if_then(
                                                                                any_token_eq(
                                                                                    Expr::var(
                                                                                        "suffix_parent_next_parent_next_kind",
                                                                                    ),
                                                                                    &[
                                                                                        TOK_LPAREN,
                                                                                        TOK_LBRACKET,
                                                                                        TOK_SEMICOLON,
                                                                                    ],
                                                                                ),
                                                                                vec![
                                                                                    Node::assign(
                                                                                        "suffix_boundary",
                                                                                        Expr::u32(1),
                                                                                    ),
                                                                                    Node::assign(
                                                                                        "suffix_boundary_kind",
                                                                                        Expr::var(
                                                                                            "suffix_parent_next_parent_next_kind",
                                                                                        ),
                                                                                    ),
                                                                                ],
                                                                            ),
                                                                        ],
                                                                    ),
                                                                ],
                                                            ),
                                                        ],
                                                    ),
                                                ],
                                            ),
                                        ],
                                    ),
                                ],
                            ),
                            Node::assign(
                                "suffix_scan_idx",
                                Expr::load(
                                    vast_nodes,
                                    Expr::add(Expr::var("suffix_scan_base"), Expr::u32(3)),
                                ),
                            ),
                        ],
                    )],
                ),
            ],
        ),
        Node::let_bind(
            "function_boundary",
            Expr::eq(Expr::var("suffix_boundary"), Expr::u32(1)),
        ),
        Node::let_bind(
            "type_name_expr_follower",
            any_token_eq(
                Expr::var("next_kind"),
                &[
                    TOK_LBRACE,
                    TOK_LPAREN,
                    TOK_IDENTIFIER,
                    TOK_INTEGER,
                    TOK_FLOAT,
                    TOK_STRING,
                    TOK_CHAR,
                    TOK_STAR,
                    TOK_AMP,
                    TOK_PLUS,
                    TOK_MINUS,
                    TOK_BANG,
                    TOK_TILDE,
                    TOK_INC,
                    TOK_DEC,
                ],
            ),
        ),
        Node::let_bind(
            "flat_type_name_expr_follower",
            any_token_eq(
                Expr::var("raw_after_after_kind"),
                &[
                    TOK_LBRACE,
                    TOK_LPAREN,
                    TOK_IDENTIFIER,
                    TOK_INTEGER,
                    TOK_FLOAT,
                    TOK_STRING,
                    TOK_CHAR,
                    TOK_STAR,
                    TOK_AMP,
                    TOK_PLUS,
                    TOK_MINUS,
                    TOK_BANG,
                    TOK_TILDE,
                    TOK_INC,
                    TOK_DEC,
                ],
            ),
        ),
        Node::let_bind(
            "identifier_type_name_paren",
            Expr::and(
                Expr::and(
                    Expr::var("raw_lparen"),
                    Expr::eq(Expr::var("first_child_kind"), Expr::u32(TOK_IDENTIFIER)),
                ),
                Expr::var("type_name_expr_follower"),
            ),
        ),
        Node::let_bind(
            "flat_identifier_type_name_paren",
            Expr::and(
                Expr::and(
                    Expr::and(
                        Expr::var("raw_lparen"),
                        Expr::eq(Expr::var("raw_next_kind"), Expr::u32(TOK_IDENTIFIER)),
                    ),
                    Expr::and(
                        is_type_name_identifier(
                            Expr::var("raw_next_typedef_flags"),
                            Expr::var("fallback_has_prior_typedef"),
                        ),
                        Expr::eq(Expr::var("raw_after_next_kind"), Expr::u32(TOK_RPAREN)),
                    ),
                ),
                Expr::var("flat_type_name_expr_follower"),
            ),
        ),
    ]);
}