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::let_bind(
            "attribute_name_context",
            Expr::and(
                Expr::and(
                    any_token_eq(Expr::var("raw_kind"), &[TOK_IDENTIFIER, TOK_CONST]),
                    Expr::eq(Expr::var("cur_parent_kind"), Expr::u32(TOK_LPAREN)),
                ),
                Expr::and(
                    Expr::eq(Expr::var("cur_parent_parent_kind"), Expr::u32(TOK_LPAREN)),
                    Expr::or(
                        Expr::eq(
                            Expr::var("cur_grandparent_prev_sibling_kind"),
                            Expr::u32(TOK_GNU_ATTRIBUTE),
                        ),
                        Expr::eq(
                            Expr::var("cur_parent_parent_prev_adjacent_kind"),
                            Expr::u32(TOK_GNU_ATTRIBUTE),
                        ),
                    ),
                ),
            ),
        ),
        Node::let_bind(
            "attribute_kind",
            Expr::select(
                Expr::var("attribute_name_context"),
                Expr::select(
                    Expr::eq(Expr::var("raw_kind"), Expr::u32(TOK_CONST)),
                    Expr::u32(C_AST_KIND_ATTRIBUTE_CONST),
                    c_attribute_kind_from_hash(Expr::var("current_symbol_hash")),
                ),
                Expr::u32(0),
            ),
        ),
        Node::let_bind(
            "direct_attribute_kind",
            Expr::select(
                Expr::and(
                    Expr::and(
                        any_token_eq(Expr::var("raw_kind"), &[TOK_IDENTIFIER, TOK_CONST]),
                        Expr::eq(Expr::var("cur_parent_kind"), Expr::u32(TOK_LPAREN)),
                    ),
                    Expr::and(
                        Expr::eq(Expr::var("cur_parent_parent_kind"), Expr::u32(TOK_LPAREN)),
                        Expr::eq(
                            Expr::var("cur_parent_parent_prev_adjacent_kind"),
                            Expr::u32(TOK_GNU_ATTRIBUTE),
                        ),
                    ),
                ),
                Expr::select(
                    Expr::eq(Expr::var("raw_kind"), Expr::u32(TOK_CONST)),
                    Expr::u32(C_AST_KIND_ATTRIBUTE_CONST),
                    c_attribute_kind_from_hash(Expr::var("current_symbol_hash")),
                ),
                Expr::u32(0),
            ),
        ),
        Node::let_bind(
            "statement_kind",
            Expr::select(
                Expr::var("is_asm_goto_qualifier"),
                Expr::u32(0),
                c_statement_kind(Expr::var("raw_kind")),
            ),
        ),
        Node::let_bind(
            "expression_kind",
            Expr::select(
                Expr::var("is_declaration_initializer_assign"),
                Expr::u32(0),
                c_expression_operator_kind(
                    Expr::var("raw_kind"),
                    Expr::var("prev_sibling_kind"),
                    Expr::var("prev_prev_sibling_kind"),
                ),
            ),
        ),
        Node::let_bind("builtin_expression_kind", {
            let token_kind = c_builtin_expression_kind(Expr::var("raw_kind"));
            Expr::select(
                Expr::ne(token_kind.clone(), Expr::u32(0)),
                token_kind,
                c_builtin_identifier_expression_kind(
                    Expr::var("raw_kind"),
                    Expr::var("current_symbol_hash"),
                    Expr::var("next_kind"),
                ),
            )
        }),
        Node::let_bind(
            "is_gnu_label_address_expr",
            Expr::and(
                Expr::and(
                    Expr::eq(Expr::var("raw_kind"), Expr::u32(TOK_AND)),
                    c_unary_context(Expr::var("prev_sibling_kind")),
                ),
                Expr::eq(Expr::var("next_kind"), Expr::u32(TOK_IDENTIFIER)),
            ),
        ),
        Node::let_bind("typed_kind", {
            let mut kind = Expr::u32(0);
            kind = Expr::select(
                Expr::and(
                    Expr::eq(Expr::var("raw_kind"), Expr::u32(TOK_IDENTIFIER)),
                    Expr::not(is_gnu_auto_type_symbol_hash(Expr::var(
                        "current_symbol_hash",
                    ))),
                ),
                Expr::u32(node_kind::VARIABLE),
                kind,
            );
            kind = Expr::select(
                is_c_literal_token(Expr::var("raw_kind")),
                Expr::u32(node_kind::LITERAL),
                kind,
            );
            kind = Expr::select(
                Expr::eq(Expr::var("raw_kind"), Expr::u32(TOK_GNU_ATTRIBUTE)),
                Expr::u32(C_AST_KIND_GNU_ATTRIBUTE),
                kind,
            );
            kind = Expr::select(
                Expr::eq(Expr::var("raw_kind"), Expr::u32(TOK_GNU_ASM)),
                Expr::u32(C_AST_KIND_INLINE_ASM),
                kind,
            );
            kind = Expr::select(
                Expr::ne(Expr::var("expression_kind"), Expr::u32(0)),
                Expr::var("expression_kind"),
                kind,
            );
            kind = Expr::select(
                Expr::ne(Expr::var("builtin_expression_kind"), Expr::u32(0)),
                Expr::var("builtin_expression_kind"),
                kind,
            );
            kind = Expr::select(
                Expr::ne(Expr::var("attribute_kind"), Expr::u32(0)),
                Expr::var("attribute_kind"),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_asm_goto_label"),
                Expr::u32(C_AST_KIND_ASM_GOTO_LABELS),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_asm_clobbers_list"),
                Expr::u32(C_AST_KIND_ASM_CLOBBERS_LIST),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_asm_input_operand"),
                Expr::u32(C_AST_KIND_ASM_INPUT_OPERAND),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_asm_output_operand"),
                Expr::u32(C_AST_KIND_ASM_OUTPUT_OPERAND),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_asm_template"),
                Expr::u32(C_AST_KIND_ASM_TEMPLATE),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_gnu_label_address_expr"),
                Expr::u32(C_AST_KIND_GNU_LABEL_ADDRESS_EXPR),
                kind,
            );
            kind = Expr::select(
                Expr::var("star_after_parenthesized_identifier_expr"),
                Expr::u32(node_kind::BINARY),
                kind,
            );
            kind = Expr::select(
                Expr::ne(Expr::var("statement_kind"), Expr::u32(0)),
                Expr::var("statement_kind"),
                kind,
            );
            kind = Expr::select(
                Expr::eq(Expr::var("raw_kind"), Expr::u32(TOK_LBRACE)),
                Expr::u32(node_kind::BASIC_BLOCK),
                kind,
            );
            kind = Expr::select(
                Expr::ne(Expr::var("direct_attribute_kind"), Expr::u32(0)),
                Expr::var("direct_attribute_kind"),
                kind,
            );
            kind = Expr::select(Expr::var("is_call"), Expr::u32(node_kind::CALL), kind);
            kind = Expr::select(
                Expr::ne(Expr::var("attribute_kind"), Expr::u32(0)),
                Expr::var("attribute_kind"),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_enumerator_decl"),
                Expr::u32(C_AST_KIND_ENUMERATOR_DECL),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_field_decl"),
                Expr::u32(C_AST_KIND_FIELD_DECL),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_initializer_list"),
                Expr::u32(C_AST_KIND_INITIALIZER_LIST),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_compound_literal"),
                Expr::u32(C_AST_KIND_COMPOUND_LITERAL_EXPR),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_cast_expr"),
                Expr::u32(C_AST_KIND_CAST_EXPR),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_array_designator_expr"),
                Expr::u32(C_AST_KIND_ARRAY_SUBSCRIPT_EXPR),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_array_decl"),
                Expr::u32(C_AST_KIND_ARRAY_DECL),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_pointer_decl"),
                Expr::u32(C_AST_KIND_POINTER_DECL),
                kind,
            );
            kind = Expr::select(
                Expr::var("is_function_declarator"),
                Expr::u32(C_AST_KIND_FUNCTION_DECLARATOR),
                kind,
            );
            Expr::select(
                Expr::var("is_function_decl"),
                Expr::u32(node_kind::FUNCTION_DECL),
                kind,
            )
        }),
        Node::let_bind(
            "final_typed_kind",
            Expr::select(
                Expr::var("is_function_definition"),
                Expr::u32(C_AST_KIND_FUNCTION_DEFINITION),
                Expr::select(
                    Expr::ne(Expr::var("aggregate_decl_kind"), Expr::u32(0)),
                    Expr::var("aggregate_decl_kind"),
                    Expr::select(
                        Expr::var("is_typedef_decl"),
                        Expr::u32(C_AST_KIND_TYPEDEF_DECL),
                        Expr::select(
                            Expr::var("is_static_assert_decl"),
                            Expr::u32(C_AST_KIND_STATIC_ASSERT_DECL),
                            Expr::select(
                                Expr::eq(Expr::var("raw_kind"), Expr::u32(TOK_GNU_LABEL)),
                                Expr::u32(C_AST_KIND_GNU_LOCAL_LABEL_DECL),
                                Expr::select(
                                    Expr::or(
                                        Expr::var("is_bit_field_decl"),
                                        Expr::var("is_anonymous_bit_field_decl"),
                                    ),
                                    Expr::u32(C_AST_KIND_BIT_FIELD_DECL),
                                    Expr::select(
                                        Expr::var("is_label_stmt"),
                                        Expr::u32(C_AST_KIND_LABEL_STMT),
                                        Expr::select(
                                            Expr::var("is_gnu_statement_expr"),
                                            Expr::u32(C_AST_KIND_GNU_STATEMENT_EXPR),
                                            Expr::select(
                                                Expr::or(
                                                    Expr::var("is_asm_goto_qualifier"),
                                                    Expr::var("is_asm_volatile_qualifier"),
                                                ),
                                                Expr::u32(C_AST_KIND_ASM_QUALIFIER),
                                                Expr::select(
                                                    Expr::ne(
                                                        Expr::var("builtin_expression_kind"),
                                                        Expr::u32(0),
                                                    ),
                                                    Expr::var("builtin_expression_kind"),
                                                    Expr::var("typed_kind"),
                                                ),
                                            ),
                                        ),
                                    ),
                                ),
                            ),
                        ),
                    ),
                ),
            ),
        ),
        Node::if_then(
            Expr::ne(Expr::var("direct_attribute_kind"), Expr::u32(0)),
            vec![Node::assign(
                "final_typed_kind",
                Expr::var("direct_attribute_kind"),
            )],
        ),
        Node::store(
            out_typed_vast_nodes,
            base.clone(),
            Expr::var("final_typed_kind"),
        ),
    ]);
}