Add mandatory return type for MIR Function

This commit is contained in:
Sofia 2025-07-07 18:32:37 +03:00
parent 0932af2e3b
commit 12dc457b99
5 changed files with 19 additions and 16 deletions

View File

@ -1,7 +1,7 @@
use crate::ast::*; use crate::ast::*;
use crate::{ use crate::{
lexer::Token, lexer::Token,
token_stream::{Error, TokenRange, TokenStream}, token_stream::{Error, TokenStream},
}; };
pub trait Parse pub trait Parse

View File

@ -1,7 +1,7 @@
use std::collections::HashMap; use std::collections::HashMap;
use crate::{ use crate::{
ast, ast::{self, TypeKind},
mir::{self, StmtKind, VariableReference}, mir::{self, StmtKind, VariableReference},
}; };
@ -176,6 +176,10 @@ impl ast::Module {
let def = mir::FunctionDefinition { let def = mir::FunctionDefinition {
name: signature.name.clone(), name: signature.name.clone(),
return_type: signature
.return_type
.map(|r| r.0.into())
.unwrap_or(mir::TypeKind::Void),
parameters: signature parameters: signature
.args .args
.iter() .iter()

View File

@ -20,7 +20,6 @@ impl mir::Module {
let mut functions = HashMap::new(); let mut functions = HashMap::new();
for function in &self.functions { for function in &self.functions {
let ret_type = function.return_type().unwrap().get_type();
let param_types: Vec<Type> = function let param_types: Vec<Type> = function
.parameters .parameters
.iter() .iter()
@ -29,9 +28,9 @@ impl mir::Module {
let func = match &function.kind { let func = match &function.kind {
mir::FunctionDefinitionKind::Local(_, _) => { mir::FunctionDefinitionKind::Local(_, _) => {
module.function(&function.name, ret_type, param_types) module.function(&function.name, function.return_type.get_type(), param_types)
} }
mir::FunctionDefinitionKind::Extern(_) => todo!(), mir::FunctionDefinitionKind::Extern => todo!(),
}; };
functions.insert(function.name.clone(), func); functions.insert(function.name.clone(), func);
} }
@ -62,7 +61,7 @@ impl mir::Module {
scope.block.terminate(TerminatorKind::Ret(ret)).unwrap(); scope.block.terminate(TerminatorKind::Ret(ret)).unwrap();
} }
} }
mir::FunctionDefinitionKind::Extern(_) => {} mir::FunctionDefinitionKind::Extern => {}
} }
} }

View File

@ -114,6 +114,7 @@ pub struct FunctionCall {
#[derive(Debug)] #[derive(Debug)]
pub struct FunctionDefinition { pub struct FunctionDefinition {
pub name: String, pub name: String,
pub return_type: TypeKind,
pub parameters: Vec<(String, TypeKind)>, pub parameters: Vec<(String, TypeKind)>,
pub kind: FunctionDefinitionKind, pub kind: FunctionDefinitionKind,
} }
@ -122,8 +123,7 @@ pub struct FunctionDefinition {
pub enum FunctionDefinitionKind { pub enum FunctionDefinitionKind {
/// Actual definition block and surrounding signature range /// Actual definition block and surrounding signature range
Local(Block, Metadata), Local(Block, Metadata),
/// Return Type Extern,
Extern(TypeKind),
} }
#[derive(Debug)] #[derive(Debug)]

View File

@ -64,11 +64,11 @@ impl ReturnType for FunctionCall {
} }
} }
impl ReturnType for FunctionDefinition { // impl ReturnType for FunctionDefinition {
fn return_type(&self) -> Result<TypeKind, ReturnTypeOther> { // fn return_type(&self) -> Result<TypeKind, ReturnTypeOther> {
match &self.kind { // match &self.kind {
FunctionDefinitionKind::Local(block, _) => block.return_type(), // FunctionDefinitionKind::Local(block, _) => block.return_type(),
FunctionDefinitionKind::Extern(type_kind) => Ok(type_kind.clone()), // FunctionDefinitionKind::Extern(type_kind) => Ok(type_kind.clone()),
} // }
} // }
} // }