[Bug] Fix ordering in unexpected_type error (#1329)

fixes ordering in ASG::unexpected_type error
This commit is contained in:
Damir S 2021-09-07 13:11:44 +03:00 committed by GitHub
parent ba306a15ca
commit d1dd42a70a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 22 additions and 13 deletions

View File

@ -74,7 +74,7 @@ impl<'a> FromAst<'a, leo_ast::ArrayInitExpression> for ArrayInitExpression<'a> {
Some(PartialType::Array(item, dims)) => (item.map(|x| *x), dims), Some(PartialType::Array(item, dims)) => (item.map(|x| *x), dims),
None => (None, None), None => (None, None),
Some(type_) => { Some(type_) => {
return Err(AsgError::unexpected_type(type_, "array", &value.span).into()); return Err(AsgError::unexpected_type("array", type_, &value.span).into());
} }
}; };
let dimensions = value let dimensions = value

View File

@ -110,7 +110,7 @@ impl<'a> FromAst<'a, leo_ast::ArrayInlineExpression> for ArrayInlineExpression<'
Some(PartialType::Type(Type::ArrayWithoutSize(item))) => (Some(item.partial()), None), Some(PartialType::Type(Type::ArrayWithoutSize(item))) => (Some(item.partial()), None),
None => (None, None), None => (None, None),
Some(type_) => { Some(type_) => {
return Err(AsgError::unexpected_type(type_, "array", &value.span).into()); return Err(AsgError::unexpected_type("array", type_, &value.span).into());
} }
}; };

View File

@ -108,7 +108,7 @@ impl<'a> FromAst<'a, leo_ast::ArrayRangeAccessExpression> for ArrayRangeAccessEx
Some(PartialType::Array(element, len)) => (Some(PartialType::Array(element, None)), len), Some(PartialType::Array(element, len)) => (Some(PartialType::Array(element, None)), len),
None => (None, None), None => (None, None),
Some(x) => { Some(x) => {
return Err(AsgError::unexpected_type(x, "array", &value.span).into()); return Err(AsgError::unexpected_type("array", x, &value.span).into());
} }
}; };
let array = <&Expression<'a>>::from_ast(scope, &*value.array, expected_array)?; let array = <&Expression<'a>>::from_ast(scope, &*value.array, expected_array)?;

View File

@ -123,7 +123,7 @@ impl<'a> FromAst<'a, leo_ast::BinaryExpression> for BinaryExpression<'a> {
BinaryOperationClass::Boolean => match expected_type { BinaryOperationClass::Boolean => match expected_type {
Some(PartialType::Type(Type::Boolean)) | None => None, Some(PartialType::Type(Type::Boolean)) | None => None,
Some(x) => { Some(x) => {
return Err(AsgError::unexpected_type(x, Type::Boolean, &value.span).into()); return Err(AsgError::unexpected_type(Type::Boolean, x, &value.span).into());
} }
}, },
BinaryOperationClass::Numeric => match expected_type { BinaryOperationClass::Numeric => match expected_type {
@ -131,7 +131,7 @@ impl<'a> FromAst<'a, leo_ast::BinaryExpression> for BinaryExpression<'a> {
Some(x @ PartialType::Type(Type::Field)) => Some(x), Some(x @ PartialType::Type(Type::Field)) => Some(x),
Some(x @ PartialType::Type(Type::Group)) => Some(x), Some(x @ PartialType::Type(Type::Group)) => Some(x),
Some(x) => { Some(x) => {
return Err(AsgError::unexpected_type(x, "integer, field, or group", &value.span).into()); return Err(AsgError::unexpected_type("integer, field, or group", x, &value.span).into());
} }
None => None, None => None,
}, },
@ -192,14 +192,16 @@ impl<'a> FromAst<'a, leo_ast::BinaryExpression> for BinaryExpression<'a> {
BinaryOperation::And | BinaryOperation::Or => match left_type { BinaryOperation::And | BinaryOperation::Or => match left_type {
Some(Type::Boolean) | None => (), Some(Type::Boolean) | None => (),
Some(x) => { Some(x) => {
return Err(AsgError::unexpected_type(x, Type::Boolean, &value.span).into()); return Err(AsgError::unexpected_type(Type::Boolean, x, &value.span).into());
} }
}, },
BinaryOperation::Eq | BinaryOperation::Ne => (), // all types allowed BinaryOperation::Eq | BinaryOperation::Ne => (), // all types allowed
_ => match left_type { op => match left_type {
Some(Type::Integer(_)) | None => (), Some(Type::Integer(_)) | None => (),
Some(x) => { Some(x) => {
return Err(AsgError::unexpected_type(x, "integer", &value.span).into()); return Err(
AsgError::operator_allowed_only_for_type(op.as_ref(), "integer", x, &value.span).into(),
);
} }
}, },
}, },

View File

@ -172,7 +172,7 @@ impl<'a> FromAst<'a, leo_ast::CircuitStaticFunctionAccessExpression> for Circuit
}; };
if let Some(expected_type) = expected_type { if let Some(expected_type) = expected_type {
return Err(AsgError::unexpected_type(expected_type, "none", &value.span).into()); return Err(AsgError::unexpected_type("none", expected_type, &value.span).into());
} }
if let Some(CircuitMember::Function(_)) = circuit.members.borrow().get(value.name.name.as_ref()) { if let Some(CircuitMember::Function(_)) = circuit.members.borrow().get(value.name.name.as_ref()) {

View File

@ -90,7 +90,7 @@ impl<'a> FromAst<'a, leo_ast::TupleAccessExpression> for TupleAccessExpression<'
if let Some(Type::Tuple(_items)) = tuple_type { if let Some(Type::Tuple(_items)) = tuple_type {
} else { } else {
return Err(AsgError::unexpected_type( return Err(AsgError::unexpected_type(
"a tuple", "tuple",
tuple_type tuple_type
.map(|x| x.to_string()) .map(|x| x.to_string())
.unwrap_or_else(|| "unknown".to_string()), .unwrap_or_else(|| "unknown".to_string()),

View File

@ -95,7 +95,7 @@ impl<'a> FromAst<'a, leo_ast::UnaryExpression> for UnaryExpression<'a> {
UnaryOperation::Not => match expected_type.map(|x| x.full()).flatten() { UnaryOperation::Not => match expected_type.map(|x| x.full()).flatten() {
Some(Type::Boolean) | None => Some(Type::Boolean), Some(Type::Boolean) | None => Some(Type::Boolean),
Some(type_) => { Some(type_) => {
return Err(AsgError::unexpected_type(type_, Type::Boolean, &value.span).into()); return Err(AsgError::unexpected_type(Type::Boolean, type_, &value.span).into());
} }
}, },
UnaryOperation::Negate => match expected_type.map(|x| x.full()).flatten() { UnaryOperation::Negate => match expected_type.map(|x| x.full()).flatten() {
@ -104,14 +104,14 @@ impl<'a> FromAst<'a, leo_ast::UnaryExpression> for UnaryExpression<'a> {
Some(Type::Field) => Some(Type::Field), Some(Type::Field) => Some(Type::Field),
None => None, None => None,
Some(type_) => { Some(type_) => {
return Err(AsgError::unexpected_type(type_, "integer, group, field", &value.span).into()); return Err(AsgError::unexpected_type("integer, group, field", type_, &value.span).into());
} }
}, },
UnaryOperation::BitNot => match expected_type.map(|x| x.full()).flatten() { UnaryOperation::BitNot => match expected_type.map(|x| x.full()).flatten() {
Some(type_ @ Type::Integer(_)) => Some(type_), Some(type_ @ Type::Integer(_)) => Some(type_),
None => None, None => None,
Some(type_) => { Some(type_) => {
return Err(AsgError::unexpected_type(type_, "integer", &value.span).into()); return Err(AsgError::unexpected_type("integer", type_, &value.span).into());
} }
}, },
}; };

View File

@ -467,4 +467,11 @@ create_errors!(
msg: format!("a variable cannot be named `{}` as a function input or variable with that name already exists in this scope", name), msg: format!("a variable cannot be named `{}` as a function input or variable with that name already exists in this scope", name),
help: None, help: None,
} }
@formatted
operator_allowed_only_for_type {
args: (operator: impl Display, type_: impl Display, received: impl Display),
msg: format!("operator '{}' is only allowed for type '{}', received: '{}'", operator, type_, received),
help: None,
}
); );