use crate::{ast::types::{BinaryOp, UnaryOp}, diagnostic::span::Span, sema::{symbol::{FunctionId, FunctionSig, SymbolId}, types::SemaType}}; pub struct HirCompileUnit { pub global_decls: Vec, } pub enum HirGlobalDeclStmt { VarDecl(HirVarDeclStmt), FuncDecl(HirFuncDeclStmt), } pub struct HirVarDeclStmt { pub values: Vec, pub data_type: SemaType, pub type_span: Span, } pub struct HirVarDeclStmtValue { pub symbol: SymbolId, pub name_span: Span, pub value: Option, } pub struct HirFuncDeclStmt { pub sig: FunctionSig, pub params: Vec, pub body: HirBlockStmt, pub ret_type_span: Span, pub name_span: Span, } pub struct HirParam { pub symbol: SymbolId, pub param_type: SemaType, pub name_span: Span, pub type_span: Span, } pub struct HirBlockStmt { pub statements: Vec, } pub enum HirStatement { Return(HirReturnStmt), Block(HirBlockStmt), Expr(HirExpr), VarDecl(HirVarDeclStmt), If(HirIfStmt), While(HirWhileStmt), For(HirForStmt), Break(HirBreakStmt), Continue(HirContinueStmt), } pub struct HirIfStmt { pub condition: HirExpr, pub then_branch: HirBlockStmt, pub ifelse_branch: Vec, pub else_branch: Option, } pub struct HirIfElseBranch { pub condition: HirExpr, pub then_branch: HirBlockStmt, } pub struct HirWhileStmt { pub condition: HirExpr, pub body: HirBlockStmt, } pub struct HirForStmt { pub init: Option, pub condition: Option, pub update: Option, pub body: HirBlockStmt, } pub enum HirForInit { Expr(HirExpr), VarDecl(HirVarDeclStmt), } pub struct HirBreakStmt { pub span: Span, } pub struct HirContinueStmt { pub span: Span, } pub struct HirReturnStmt { pub value: Option, pub span: Span, } pub struct HirExpr { pub value: HirExprValue, pub ty: SemaType, pub span: Span, } pub enum HirExprValue { IntLit(i64), Var(SymbolId), ArrayAccess { array: Box, index: Box, }, BinaryOp { lhs: Box, op: BinaryOp, rhs: Box, }, UnaryOp { op: UnaryOp, operand: Box, }, IncDec { op: crate::ast::types::IncDecOp, operand: Box, is_prefix: bool, }, FuncCall(FunctionId, Vec), Assign { lvalue: Box, rvalue: Box, }, }