Add AST -> MIR for custom binops

This commit is contained in:
Sofia 2025-07-24 12:34:16 +03:00
parent 5ef329d570
commit 974c7e98f1
3 changed files with 32 additions and 6 deletions

View File

@ -212,11 +212,11 @@ pub enum TopLevelStatement {
#[derive(Debug)] #[derive(Debug)]
pub struct BinopDefinition { pub struct BinopDefinition {
lhs: (String, Type), pub lhs: (String, Type),
op: BinaryOperator, pub op: BinaryOperator,
rhs: (String, Type), pub rhs: (String, Type),
return_ty: Type, pub return_ty: Type,
block: Block, pub block: Block,
} }
#[derive(Debug)] #[derive(Debug)]

View File

@ -23,6 +23,7 @@ impl ast::Module {
let mut imports = Vec::new(); let mut imports = Vec::new();
let mut functions = Vec::new(); let mut functions = Vec::new();
let mut typedefs = Vec::new(); let mut typedefs = Vec::new();
let mut binops = Vec::new();
use ast::TopLevelStatement::*; use ast::TopLevelStatement::*;
for stmt in &self.top_level_statements { for stmt in &self.top_level_statements {
@ -97,13 +98,28 @@ impl ast::Module {
}; };
typedefs.push(def); typedefs.push(def);
} }
BinopDefinition(binop_definition) => todo!(), BinopDefinition(ast::BinopDefinition {
lhs,
op,
rhs,
return_ty,
block,
}) => {
binops.push(mir::BinopDefinition {
lhs: (lhs.0.clone(), lhs.1 .0.into_mir(module_id)),
op: op.mir(),
rhs: (rhs.0.clone(), rhs.1 .0.into_mir(module_id)),
return_ty: return_ty.0.into_mir(module_id),
block: block.into_mir(module_id),
});
}
} }
} }
mir::Module { mir::Module {
name: self.name.clone(), name: self.name.clone(),
module_id: module_id, module_id: module_id,
binop_defs: binops,
imports, imports,
functions, functions,
path: self.path.clone(), path: self.path.clone(),

View File

@ -365,6 +365,15 @@ pub enum TypeDefinitionKind {
Struct(StructType), Struct(StructType),
} }
#[derive(Debug)]
pub struct BinopDefinition {
pub lhs: (String, TypeKind),
pub op: BinaryOperator,
pub rhs: (String, TypeKind),
pub return_ty: TypeKind,
pub block: Block,
}
#[derive(Debug)] #[derive(Debug)]
pub struct Module { pub struct Module {
pub name: String, pub name: String,
@ -372,6 +381,7 @@ pub struct Module {
pub imports: Vec<Import>, pub imports: Vec<Import>,
pub functions: Vec<FunctionDefinition>, pub functions: Vec<FunctionDefinition>,
pub typedefs: Vec<TypeDefinition>, pub typedefs: Vec<TypeDefinition>,
pub binop_defs: Vec<BinopDefinition>,
pub path: Option<PathBuf>, pub path: Option<PathBuf>,
pub tokens: Vec<FullToken>, pub tokens: Vec<FullToken>,
pub is_main: bool, pub is_main: bool,