Add return type for index and array expressions
This commit is contained in:
parent
ad20fefabc
commit
10cf9341c5
@ -7,6 +7,7 @@ pub enum ReturnTypeOther {
|
|||||||
Set(Metadata),
|
Set(Metadata),
|
||||||
EmptyBlock(Metadata),
|
EmptyBlock(Metadata),
|
||||||
NoBlockReturn(Metadata),
|
NoBlockReturn(Metadata),
|
||||||
|
IndexingNonArray(Metadata),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TypeKind {
|
impl TypeKind {
|
||||||
@ -86,8 +87,25 @@ impl ReturnType for Expression {
|
|||||||
Block(block) => block.return_type(),
|
Block(block) => block.return_type(),
|
||||||
FunctionCall(fcall) => fcall.return_type(),
|
FunctionCall(fcall) => fcall.return_type(),
|
||||||
If(expr) => expr.return_type(),
|
If(expr) => expr.return_type(),
|
||||||
Index(expression, _) => todo!("return type for index"),
|
Index(expression, _) => {
|
||||||
Array(expressions) => todo!("return type for array expression"),
|
let expr_type = expression.return_type()?;
|
||||||
|
if let (_, TypeKind::Array(elem_ty, _)) = expr_type {
|
||||||
|
Ok((ReturnKind::Soft, *elem_ty))
|
||||||
|
} else {
|
||||||
|
Err(ReturnTypeOther::IndexingNonArray(expression.1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Array(expressions) => {
|
||||||
|
let first = expressions
|
||||||
|
.iter()
|
||||||
|
.next()
|
||||||
|
.map(|e| e.return_type())
|
||||||
|
.unwrap_or(Ok((ReturnKind::Soft, TypeKind::Void)))?;
|
||||||
|
Ok((
|
||||||
|
ReturnKind::Soft,
|
||||||
|
TypeKind::Array(Box::new(first.1), expressions.len() as u64),
|
||||||
|
))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user