Ctrl K
ComunidadGuías…

src/analysis/typecheck_internal.h

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// SPDX-License-Identifier: MIT
#ifndef TYPECHECK_INTERNAL_H
#ifndef ZC_ALLOW_INTERNAL
#error                                                                                             \
    "analysis/typecheck_internal.h is internal to Zen C. Include the appropriate public header instead."
#endif

#define TYPECHECK_INTERNAL_H

#include "../constants.h"
#include "typecheck.h"
#include "move_check.h"
#include "platform/misra.h"

// Symbol set for side-effect collision detection
typedef struct
{
    ZenSymbol *syms[32];
    int count;
} SymbolSet;

int eval_const_int_expr(ASTNode *node, ParserContext *ctx, long long *out_val);
int is_expression_invariant(TypeChecker *tc, ASTNode *node, int *val);

// Main dispatch + program-level (defined in typecheck.c)
void check_node(TypeChecker *tc, ASTNode *node, int depth);

// Utility helpers (defined in typecheck_utils.c)
int get_asm_register_size(Type *t);
void collect_symbols(ASTNode *node, SymbolSet *reads, SymbolSet *writes);
void tc_enter_scope(TypeChecker *tc);
void tc_exit_scope(TypeChecker *tc);
void tc_add_symbol(TypeChecker *tc, const char *name, Type *type, Token t, int is_immutable);
ZenSymbol *tc_lookup(TypeChecker *tc, const char *name);
void mark_type_as_used(TypeChecker *tc, Type *t);
int is_char_type(Type *t);
int integer_type_width(Type *t);
void check_side_effect_collision(TypeChecker *tc, ASTNode *left, ASTNode *right, Token token);
void check_all_args_side_effects(TypeChecker *tc, ASTNode *receiver, ASTNode *args, Token token);

// Expression checkers (defined in typecheck_expr.c)
void check_move_for_rvalue(TypeChecker *tc, ASTNode *rvalue);
void check_expr_unary(TypeChecker *tc, ASTNode *node, int depth);
void check_expr_binary(TypeChecker *tc, ASTNode *node, int depth);
void check_expr_var(TypeChecker *tc, ASTNode *node);
void check_expr_literal(TypeChecker *tc, ASTNode *node);
void check_struct_init(TypeChecker *tc, ASTNode *node, int depth);
void check_expr_lambda(TypeChecker *tc, ASTNode *node, int depth);
int check_type_compatibility(TypeChecker *tc, Type *target, Type *value, Token t,
                             ASTNode *value_node, int is_call_arg);
void apply_implicit_struct_pointer_conversions(TypeChecker *tc, ASTNode **expr_ptr,
                                               Type *expected_type);
void extract_base_name(const char *full_name, char *base_buf, size_t max_len);
int is_struct_base_match(Type *base, Type *instantiated);

// Call checker (defined in typecheck_call.c)
void check_expr_call(TypeChecker *tc, ASTNode *node, int depth);

// Statement checkers (defined in typecheck_stmt.c)
void check_block(TypeChecker *tc, ASTNode *block, int depth);
void check_var_decl(TypeChecker *tc, ASTNode *node, int depth);
void check_function(TypeChecker *tc, ASTNode *node, int depth);
void check_loop_passes(TypeChecker *tc, ASTNode *node, int depth);
void tc_check_trait(TypeChecker *tc, ASTNode *node, int depth);
void tc_check_impl(TypeChecker *tc, ASTNode *node, int depth);
void tc_check_impl_trait(TypeChecker *tc, ASTNode *node, int depth);
int block_always_returns(ASTNode *block);
int stmt_always_returns(ASTNode *stmt);

#endif