Add mandatory return type for MIR Function
This commit is contained in:
parent
0932af2e3b
commit
12dc457b99
@ -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
|
||||||
|
@ -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()
|
||||||
|
@ -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 => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)]
|
||||||
|
@ -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()),
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
Loading…
Reference in New Issue
Block a user