vyre-libs 0.6.3

vyre Category A library ecosystem - pure-IR compositions over vyre-ops hardware primitives
Documentation
use super::super::decl_context_common;
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::var("needs_decl_context"),
            vec![Node::loop_for(
                "decl_ctx_scan",
                Expr::var("decl_ctx_scan_start"),
                t.clone(),
                vec![
                    decl_context_common::bind_vast_node_base(
                        "decl_ctx_base",
                        Expr::var("decl_ctx_scan"),
                    ),
                    decl_context_common::bind_vast_node_kind(
                        "decl_ctx_kind",
                        vast_nodes,
                        "decl_ctx_base",
                    ),
                    decl_context_common::bind_vast_node_field(
                        "decl_ctx_typedef_flags",
                        vast_nodes,
                        "decl_ctx_base",
                        VAST_TYPEDEF_FLAGS_FIELD,
                    ),
                    decl_context_common::bind_vast_node_field(
                        "decl_ctx_symbol_hash",
                        vast_nodes,
                        "decl_ctx_base",
                        VAST_TYPEDEF_SYMBOL_FIELD,
                    ),
                    decl_context_common::bind_vast_node_parent(
                        "decl_ctx_parent",
                        vast_nodes,
                        "decl_ctx_base",
                    ),
                    Node::if_then(
                        Expr::eq(Expr::var("decl_ctx_parent"), Expr::var("cur_parent")),
                        vec![
                            Node::let_bind(
                                "decl_ctx_aggregate_body_open",
                                is_aggregate_specifier_body_open(
                                    Expr::var("decl_ctx_kind"),
                                    Expr::var("last_decl_ctx_kind"),
                                    Expr::var("prev_decl_ctx_kind"),
                                ),
                            ),
                            Node::if_then(
                                is_decl_prefix_reset_token(Expr::var("decl_ctx_kind")),
                                vec![
                                    Node::assign("has_decl_prefix", Expr::u32(0)),
                                    Node::assign("decl_ctx_leading_gnu_attribute", Expr::u32(0)),
                                    Node::assign(
                                        "decl_ctx_last_reset_idx",
                                        Expr::var("decl_ctx_scan"),
                                    ),
                                ],
                            ),
                            Node::if_then(
                                Expr::and(
                                    Expr::eq(
                                        Expr::var("decl_ctx_kind"),
                                        Expr::u32(TOK_GNU_ATTRIBUTE),
                                    ),
                                    Expr::and(
                                        Expr::eq(Expr::var("has_decl_prefix"), Expr::u32(0)),
                                        Expr::or(
                                            Expr::eq(
                                                Expr::var("last_decl_ctx_kind"),
                                                Expr::u32(SENTINEL),
                                            ),
                                            is_decl_prefix_reset_token(Expr::var(
                                                "last_decl_ctx_kind",
                                            )),
                                        ),
                                    ),
                                ),
                                vec![Node::assign("decl_ctx_leading_gnu_attribute", Expr::u32(1))],
                            ),
                            Node::if_then(
                                Expr::or(
                                    is_decl_prefix_token_or_gnu_type_hash(
                                        Expr::var("decl_ctx_kind"),
                                        Expr::var("decl_ctx_symbol_hash"),
                                    ),
                                    Expr::or(
                                        Expr::var("decl_ctx_aggregate_body_open"),
                                        Expr::and(
                                            Expr::eq(
                                                Expr::var("decl_ctx_kind"),
                                                Expr::u32(TOK_IDENTIFIER),
                                            ),
                                            is_typedef_name_annotation(Expr::var(
                                                "decl_ctx_typedef_flags",
                                            )),
                                        ),
                                    ),
                                ),
                                vec![Node::assign("has_decl_prefix", Expr::u32(1))],
                            ),
                            Node::assign("prev_decl_ctx_kind", Expr::var("last_decl_ctx_kind")),
                            Node::assign("last_decl_ctx_kind", Expr::var("decl_ctx_kind")),
                        ],
                    ),
                ],
            )],
        ),
        Node::let_bind("decl_ctx_leading_definition_attribute", Expr::u32(0)),
        Node::if_then(
            Expr::eq(Expr::var("decl_ctx_leading_gnu_attribute"), Expr::u32(1)),
            vec![Node::loop_for(
                "decl_ctx_attr_scan",
                Expr::var("decl_ctx_scan_start"),
                t.clone(),
                vec![
                    Node::let_bind(
                        "decl_ctx_attr_after_reset",
                        Expr::or(
                            Expr::eq(Expr::var("decl_ctx_last_reset_idx"), Expr::u32(SENTINEL)),
                            Expr::gt(
                                Expr::var("decl_ctx_attr_scan"),
                                Expr::var("decl_ctx_last_reset_idx"),
                            ),
                        ),
                    ),
                    Node::if_then(
                        Expr::var("decl_ctx_attr_after_reset"),
                        vec![
                            decl_context_common::bind_vast_node_base(
                                "decl_ctx_attr_base",
                                Expr::var("decl_ctx_attr_scan"),
                            ),
                            decl_context_common::bind_vast_node_kind(
                                "decl_ctx_attr_kind",
                                vast_nodes,
                                "decl_ctx_attr_base",
                            ),
                            Node::if_then(
                                any_token_eq(
                                    Expr::var("decl_ctx_attr_kind"),
                                    &[TOK_IDENTIFIER, TOK_CONST],
                                ),
                                vec![
                                    decl_context_common::bind_vast_node_parent(
                                        "decl_ctx_attr_parent",
                                        vast_nodes,
                                        "decl_ctx_attr_base",
                                    ),
                                    Node::let_bind(
                                        "decl_ctx_attr_parent_valid",
                                        Expr::lt(
                                            Expr::var("decl_ctx_attr_parent"),
                                            num_nodes.clone(),
                                        ),
                                    ),
                                    Node::let_bind(
                                        "decl_ctx_attr_parent_base",
                                        decl_context_common::vast_node_base(Expr::select(
                                            Expr::var("decl_ctx_attr_parent_valid"),
                                            Expr::var("decl_ctx_attr_parent"),
                                            t.clone(),
                                        )),
                                    ),
                                    Node::let_bind(
                                        "decl_ctx_attr_parent_kind",
                                        Expr::select(
                                            Expr::var("decl_ctx_attr_parent_valid"),
                                            decl_context_common::load_vast_node_kind(
                                                vast_nodes,
                                                Expr::var("decl_ctx_attr_parent_base"),
                                            ),
                                            Expr::u32(0),
                                        ),
                                    ),
                                    Node::let_bind(
                                        "decl_ctx_attr_parent_parent",
                                        Expr::select(
                                            Expr::var("decl_ctx_attr_parent_valid"),
                                            decl_context_common::load_vast_node_parent(
                                                vast_nodes,
                                                Expr::var("decl_ctx_attr_parent_base"),
                                            ),
                                            Expr::u32(SENTINEL),
                                        ),
                                    ),
                                    Node::let_bind(
                                        "decl_ctx_attr_parent_parent_valid",
                                        Expr::lt(
                                            Expr::var("decl_ctx_attr_parent_parent"),
                                            num_nodes.clone(),
                                        ),
                                    ),
                                    Node::let_bind(
                                        "decl_ctx_attr_parent_parent_base",
                                        decl_context_common::vast_node_base(Expr::select(
                                            Expr::var("decl_ctx_attr_parent_parent_valid"),
                                            Expr::var("decl_ctx_attr_parent_parent"),
                                            t.clone(),
                                        )),
                                    ),
                                    Node::let_bind(
                                        "decl_ctx_attr_parent_parent_kind",
                                        Expr::select(
                                            Expr::var("decl_ctx_attr_parent_parent_valid"),
                                            decl_context_common::load_vast_node_kind(
                                                vast_nodes,
                                                Expr::var("decl_ctx_attr_parent_parent_base"),
                                            ),
                                            Expr::u32(0),
                                        ),
                                    ),
                                    Node::let_bind(
                                        "decl_ctx_attr_grandparent",
                                        Expr::select(
                                            Expr::var("decl_ctx_attr_parent_parent_valid"),
                                            decl_context_common::load_vast_node_parent(
                                                vast_nodes,
                                                Expr::var("decl_ctx_attr_parent_parent_base"),
                                            ),
                                            Expr::u32(SENTINEL),
                                        ),
                                    ),
                                    Node::let_bind(
                                        "decl_ctx_attr_prefix_kind",
                                        Expr::u32(SENTINEL),
                                    ),
                                    Node::loop_for(
                                        "decl_ctx_attr_prev_scan",
                                        Expr::u32(0),
                                        Expr::select(
                                            Expr::var("decl_ctx_attr_parent_parent_valid"),
                                            Expr::var("decl_ctx_attr_parent_parent"),
                                            Expr::u32(0),
                                        ),
                                        vec![
                                            decl_context_common::bind_vast_node_base(
                                                "decl_ctx_attr_prev_base",
                                                Expr::var("decl_ctx_attr_prev_scan"),
                                            ),
                                            decl_context_common::bind_vast_node_parent(
                                                "decl_ctx_attr_prev_parent",
                                                vast_nodes,
                                                "decl_ctx_attr_prev_base",
                                            ),
                                            Node::if_then(
                                                Expr::eq(
                                                    Expr::var("decl_ctx_attr_prev_parent"),
                                                    Expr::var("decl_ctx_attr_grandparent"),
                                                ),
                                                vec![Node::assign(
                                                    "decl_ctx_attr_prefix_kind",
                                                    decl_context_common::load_vast_node_kind(
                                                        vast_nodes,
                                                        Expr::var("decl_ctx_attr_prev_base"),
                                                    ),
                                                )],
                                            ),
                                        ],
                                    ),
                                    decl_context_common::bind_vast_node_field(
                                        "decl_ctx_attr_symbol",
                                        vast_nodes,
                                        "decl_ctx_attr_base",
                                        VAST_TYPEDEF_SYMBOL_FIELD,
                                    ),
                                    Node::let_bind(
                                        "decl_ctx_attr_specific_kind",
                                        Expr::select(
                                            Expr::eq(
                                                Expr::var("decl_ctx_attr_kind"),
                                                Expr::u32(TOK_CONST),
                                            ),
                                            Expr::u32(C_AST_KIND_ATTRIBUTE_CONST),
                                            c_attribute_kind_from_hash(Expr::var(
                                                "decl_ctx_attr_symbol",
                                            )),
                                        ),
                                    ),
                                    Node::if_then(
                                        Expr::and(
                                            Expr::and(
                                                Expr::eq(
                                                    Expr::var("decl_ctx_attr_parent_kind"),
                                                    Expr::u32(TOK_LPAREN),
                                                ),
                                                Expr::eq(
                                                    Expr::var("decl_ctx_attr_parent_parent_kind"),
                                                    Expr::u32(TOK_LPAREN),
                                                ),
                                            ),
                                            Expr::and(
                                                Expr::eq(
                                                    Expr::var("decl_ctx_attr_prefix_kind"),
                                                    Expr::u32(TOK_GNU_ATTRIBUTE),
                                                ),
                                                any_token_eq(
                                                    Expr::var("decl_ctx_attr_specific_kind"),
                                                    &[
                                                        C_AST_KIND_ATTRIBUTE_CONSTRUCTOR,
                                                        C_AST_KIND_ATTRIBUTE_DESTRUCTOR,
                                                    ],
                                                ),
                                            ),
                                        ),
                                        vec![Node::assign(
                                            "decl_ctx_leading_definition_attribute",
                                            Expr::u32(1),
                                        )],
                                    ),
                                ],
                            ),
                        ],
                    ),
                ],
            )],
        ),
    ]);
}