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::{
lexer::Token,
token_stream::{Error, TokenRange, TokenStream},
token_stream::{Error, TokenStream},
};
pub trait Parse

View File

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

View File

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

View File

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

View File

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