Continue implementing type construtors

This commit is contained in:
Jeff 2024-06-18 22:01:18 -04:00
parent 799467b25b
commit 7dc62bfd5f
4 changed files with 52 additions and 11 deletions

View File

@ -18,7 +18,7 @@ pub enum Type {
Float, Float,
Function { Function {
type_parameters: Option<Vec<Identifier>>, type_parameters: Option<Vec<Identifier>>,
value_parameters: Vec<(Identifier, Type)>, value_parameters: Vec<Type>,
return_type: Box<Type>, return_type: Box<Type>,
}, },
Generic(Option<Box<Type>>), Generic(Option<Box<Type>>),
@ -236,8 +236,8 @@ impl Display for Type {
write!(f, ")(")?; write!(f, ")(")?;
} }
for (identifier, r#type) in value_parameters { for r#type in value_parameters {
write!(f, "{identifier}: {type}")?; write!(f, "{type}")?;
} }
write!(f, ") : {}", return_type) write!(f, ") : {}", return_type)

View File

@ -49,7 +49,35 @@ impl TypeConstructor {
pub fn construct(self, context: &Context) -> Result<Type, ValidationError> { pub fn construct(self, context: &Context) -> Result<Type, ValidationError> {
let r#type = match self { let r#type = match self {
TypeConstructor::Function(_) => todo!(), TypeConstructor::Function(function_type_constructor) => {
let FunctionTypeConstructor {
type_parameters: declared_type_parameters,
value_parameters: declared_value_parameters,
return_type,
} = function_type_constructor.node;
let type_parameters = declared_type_parameters.map(|identifiers| {
identifiers
.into_iter()
.map(|identifier| identifier.node)
.collect()
});
let mut value_parameters = Vec::with_capacity(declared_value_parameters.len());
for parameter in declared_value_parameters {
let r#type = parameter.construct(&context)?;
value_parameters.push(r#type);
}
let return_type = Box::new(return_type.construct(&context)?);
Type::Function {
type_parameters,
value_parameters,
return_type,
}
}
TypeConstructor::Identifier(WithPosition { TypeConstructor::Identifier(WithPosition {
node: identifier, .. node: identifier, ..
}) => { }) => {

View File

@ -347,10 +347,10 @@ impl ExpectedType for ValueNode {
} => { } => {
let mut value_parameter_types = Vec::with_capacity(value_parameters.len()); let mut value_parameter_types = Vec::with_capacity(value_parameters.len());
for (identifier, type_constructor) in value_parameters { for (_, type_constructor) in value_parameters {
let r#type = type_constructor.clone().construct(&context)?; let r#type = type_constructor.clone().construct(&context)?;
value_parameter_types.push((identifier.clone(), r#type)); value_parameter_types.push(r#type);
} }
let type_parameters = type_parameters.clone().map(|parameters| { let type_parameters = type_parameters.clone().map(|parameters| {

View File

@ -234,11 +234,20 @@ impl ValueInner {
ValueInner::Map(_) => Type::Map, ValueInner::Map(_) => Type::Map,
ValueInner::Range(_) => Type::Range, ValueInner::Range(_) => Type::Range,
ValueInner::String(_) => Type::String, ValueInner::String(_) => Type::String,
ValueInner::Function(function) => Type::Function { ValueInner::Function(function) => {
type_parameters: None, let value_parameters = function
value_parameters: function.value_parameters.clone(), .value_parameters()
.into_iter()
.map(|(_, r#type)| r#type)
.cloned()
.collect();
Type::Function {
type_parameters: function.type_parameters().clone(),
value_parameters,
return_type: Box::new(function.return_type.clone()), return_type: Box::new(function.return_type.clone()),
}, }
}
ValueInner::Structure { name, .. } => { ValueInner::Structure { name, .. } => {
if let Some(r#type) = context.get_type(&name.node)? { if let Some(r#type) = context.get_type(&name.node)? {
r#type r#type
@ -328,6 +337,10 @@ impl Function {
&self.type_parameters &self.type_parameters
} }
pub fn value_parameters(&self) -> &Vec<(Identifier, Type)> {
&self.value_parameters
}
pub fn call( pub fn call(
self, self,
arguments: Vec<Value>, arguments: Vec<Value>,