nushell/crates/nu-parser/src/type_check.rs

98 lines
3.6 KiB
Rust
Raw Normal View History

2021-07-30 00:56:51 +02:00
use crate::{parser::Operator, parser_state::Type, Expr, Expression, ParseError, ParserWorkingSet};
impl<'a> ParserWorkingSet<'a> {
2021-08-17 01:00:00 +02:00
pub fn type_compatible(lhs: &Type, rhs: &Type) -> bool {
match (lhs, rhs) {
(Type::List(c), Type::List(d)) => ParserWorkingSet::type_compatible(c, d),
(Type::Unknown, _) => true,
(_, Type::Unknown) => true,
(lhs, rhs) => lhs == rhs,
}
}
2021-07-30 00:56:51 +02:00
pub fn math_result_type(
&self,
lhs: &mut Expression,
op: &mut Expression,
rhs: &mut Expression,
) -> (Type, Option<ParseError>) {
match &op.expr {
Expr::Operator(operator) => match operator {
2021-08-08 22:21:21 +02:00
Operator::Equal => (Type::Bool, None),
2021-07-30 22:02:16 +02:00
Operator::Multiply => match (&lhs.ty, &rhs.ty) {
(Type::Int, Type::Int) => (Type::Int, None),
(Type::Unknown, _) => (Type::Unknown, None),
(_, Type::Unknown) => (Type::Unknown, None),
_ => {
*op = Expression::garbage(op.span);
(
Type::Unknown,
2021-08-17 01:00:00 +02:00
Some(ParseError::UnsupportedOperation(
op.span,
lhs.span,
lhs.ty.clone(),
rhs.span,
rhs.ty.clone(),
)),
2021-07-30 22:02:16 +02:00
)
}
},
2021-07-30 00:56:51 +02:00
Operator::Plus => match (&lhs.ty, &rhs.ty) {
(Type::Int, Type::Int) => (Type::Int, None),
(Type::String, Type::String) => (Type::String, None),
(Type::Unknown, _) => (Type::Unknown, None),
(_, Type::Unknown) => (Type::Unknown, None),
(Type::Int, _) => {
*rhs = Expression::garbage(rhs.span);
(
Type::Unknown,
2021-08-17 01:00:00 +02:00
Some(ParseError::UnsupportedOperation(
op.span,
lhs.span,
lhs.ty.clone(),
rhs.span,
rhs.ty.clone(),
)),
2021-07-30 00:56:51 +02:00
)
}
_ => {
*op = Expression::garbage(op.span);
(
Type::Unknown,
2021-08-17 01:00:00 +02:00
Some(ParseError::UnsupportedOperation(
op.span,
lhs.span,
lhs.ty.clone(),
rhs.span,
rhs.ty.clone(),
)),
2021-07-30 00:56:51 +02:00
)
}
},
_ => {
*op = Expression::garbage(op.span);
2021-08-17 01:00:00 +02:00
2021-07-30 00:56:51 +02:00
(
Type::Unknown,
2021-08-17 01:00:00 +02:00
Some(ParseError::UnsupportedOperation(
op.span,
lhs.span,
lhs.ty.clone(),
rhs.span,
rhs.ty.clone(),
)),
2021-07-30 00:56:51 +02:00
)
}
},
_ => {
*op = Expression::garbage(op.span);
2021-08-17 01:00:00 +02:00
2021-07-30 00:56:51 +02:00
(
Type::Unknown,
2021-08-17 01:00:00 +02:00
Some(ParseError::IncompleteMathExpression(op.span)),
2021-07-30 00:56:51 +02:00
)
}
}
}
}