diff options
Diffstat (limited to 'crates/hir_ty/src/op.rs')
-rw-r--r-- | crates/hir_ty/src/op.rs | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/crates/hir_ty/src/op.rs b/crates/hir_ty/src/op.rs index a4999c51d..1c01a67ad 100644 --- a/crates/hir_ty/src/op.rs +++ b/crates/hir_ty/src/op.rs | |||
@@ -1,30 +1,23 @@ | |||
1 | //! Helper functions for binary operator type inference. | 1 | //! Helper functions for binary operator type inference. |
2 | use hir_def::expr::{ArithOp, BinaryOp, CmpOp}; | 2 | use hir_def::expr::{ArithOp, BinaryOp, CmpOp}; |
3 | 3 | ||
4 | use super::{InferTy, Ty, TypeCtor}; | 4 | use crate::{InferTy, Scalar, Ty}; |
5 | use crate::{ApplicationTy, Scalar}; | ||
6 | 5 | ||
7 | pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty { | 6 | pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty { |
8 | match op { | 7 | match op { |
9 | BinaryOp::LogicOp(_) | BinaryOp::CmpOp(_) => Ty::simple(TypeCtor::Scalar(Scalar::Bool)), | 8 | BinaryOp::LogicOp(_) | BinaryOp::CmpOp(_) => Ty::Scalar(Scalar::Bool), |
10 | BinaryOp::Assignment { .. } => Ty::unit(), | 9 | BinaryOp::Assignment { .. } => Ty::unit(), |
11 | BinaryOp::ArithOp(ArithOp::Shl) | BinaryOp::ArithOp(ArithOp::Shr) => match lhs_ty { | 10 | BinaryOp::ArithOp(ArithOp::Shl) | BinaryOp::ArithOp(ArithOp::Shr) => match lhs_ty { |
12 | Ty::Apply(ApplicationTy { ctor, .. }) => match ctor { | 11 | Ty::Scalar(Scalar::Int(_)) |
13 | TypeCtor::Scalar(Scalar::Int(_)) | 12 | | Ty::Scalar(Scalar::Uint(_)) |
14 | | TypeCtor::Scalar(Scalar::Uint(_)) | 13 | | Ty::Scalar(Scalar::Float(_)) => lhs_ty, |
15 | | TypeCtor::Scalar(Scalar::Float(_)) => lhs_ty, | ||
16 | _ => Ty::Unknown, | ||
17 | }, | ||
18 | Ty::Infer(InferTy::IntVar(..)) | Ty::Infer(InferTy::FloatVar(..)) => lhs_ty, | 14 | Ty::Infer(InferTy::IntVar(..)) | Ty::Infer(InferTy::FloatVar(..)) => lhs_ty, |
19 | _ => Ty::Unknown, | 15 | _ => Ty::Unknown, |
20 | }, | 16 | }, |
21 | BinaryOp::ArithOp(_) => match rhs_ty { | 17 | BinaryOp::ArithOp(_) => match rhs_ty { |
22 | Ty::Apply(ApplicationTy { ctor, .. }) => match ctor { | 18 | Ty::Scalar(Scalar::Int(_)) |
23 | TypeCtor::Scalar(Scalar::Int(_)) | 19 | | Ty::Scalar(Scalar::Uint(_)) |
24 | | TypeCtor::Scalar(Scalar::Uint(_)) | 20 | | Ty::Scalar(Scalar::Float(_)) => rhs_ty, |
25 | | TypeCtor::Scalar(Scalar::Float(_)) => rhs_ty, | ||
26 | _ => Ty::Unknown, | ||
27 | }, | ||
28 | Ty::Infer(InferTy::IntVar(..)) | Ty::Infer(InferTy::FloatVar(..)) => rhs_ty, | 21 | Ty::Infer(InferTy::IntVar(..)) | Ty::Infer(InferTy::FloatVar(..)) => rhs_ty, |
29 | _ => Ty::Unknown, | 22 | _ => Ty::Unknown, |
30 | }, | 23 | }, |
@@ -33,13 +26,10 @@ pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty { | |||
33 | 26 | ||
34 | pub(super) fn binary_op_rhs_expectation(op: BinaryOp, lhs_ty: Ty) -> Ty { | 27 | pub(super) fn binary_op_rhs_expectation(op: BinaryOp, lhs_ty: Ty) -> Ty { |
35 | match op { | 28 | match op { |
36 | BinaryOp::LogicOp(..) => Ty::simple(TypeCtor::Scalar(Scalar::Bool)), | 29 | BinaryOp::LogicOp(..) => Ty::Scalar(Scalar::Bool), |
37 | BinaryOp::Assignment { op: None } => lhs_ty, | 30 | BinaryOp::Assignment { op: None } => lhs_ty, |
38 | BinaryOp::CmpOp(CmpOp::Eq { .. }) => match lhs_ty { | 31 | BinaryOp::CmpOp(CmpOp::Eq { .. }) => match lhs_ty { |
39 | Ty::Apply(ApplicationTy { ctor, .. }) => match ctor { | 32 | Ty::Scalar(_) | Ty::Str => lhs_ty, |
40 | TypeCtor::Scalar(_) | TypeCtor::Str => lhs_ty, | ||
41 | _ => Ty::Unknown, | ||
42 | }, | ||
43 | Ty::Infer(InferTy::IntVar(..)) | Ty::Infer(InferTy::FloatVar(..)) => lhs_ty, | 33 | Ty::Infer(InferTy::IntVar(..)) | Ty::Infer(InferTy::FloatVar(..)) => lhs_ty, |
44 | _ => Ty::Unknown, | 34 | _ => Ty::Unknown, |
45 | }, | 35 | }, |
@@ -47,12 +37,9 @@ pub(super) fn binary_op_rhs_expectation(op: BinaryOp, lhs_ty: Ty) -> Ty { | |||
47 | BinaryOp::CmpOp(CmpOp::Ord { .. }) | 37 | BinaryOp::CmpOp(CmpOp::Ord { .. }) |
48 | | BinaryOp::Assignment { op: Some(_) } | 38 | | BinaryOp::Assignment { op: Some(_) } |
49 | | BinaryOp::ArithOp(_) => match lhs_ty { | 39 | | BinaryOp::ArithOp(_) => match lhs_ty { |
50 | Ty::Apply(ApplicationTy { ctor, .. }) => match ctor { | 40 | Ty::Scalar(Scalar::Int(_)) |
51 | TypeCtor::Scalar(Scalar::Int(_)) | 41 | | Ty::Scalar(Scalar::Uint(_)) |
52 | | TypeCtor::Scalar(Scalar::Uint(_)) | 42 | | Ty::Scalar(Scalar::Float(_)) => lhs_ty, |
53 | | TypeCtor::Scalar(Scalar::Float(_)) => lhs_ty, | ||
54 | _ => Ty::Unknown, | ||
55 | }, | ||
56 | Ty::Infer(InferTy::IntVar(..)) | Ty::Infer(InferTy::FloatVar(..)) => lhs_ty, | 43 | Ty::Infer(InferTy::IntVar(..)) | Ty::Infer(InferTy::FloatVar(..)) => lhs_ty, |
57 | _ => Ty::Unknown, | 44 | _ => Ty::Unknown, |
58 | }, | 45 | }, |