Continue implementing type construtors
This commit is contained in:
parent
799467b25b
commit
7dc62bfd5f
@ -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)
|
||||||
|
@ -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, ..
|
||||||
}) => {
|
}) => {
|
||||||
|
@ -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| {
|
||||||
|
@ -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()
|
||||||
return_type: Box::new(function.return_type.clone()),
|
.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()),
|
||||||
|
}
|
||||||
|
}
|
||||||
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>,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user