aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/op.rs
diff options
context:
space:
mode:
authorLukas Wirth <[email protected]>2021-02-28 18:13:37 +0000
committerLukas Wirth <[email protected]>2021-02-28 18:13:37 +0000
commita3f5491a1a312393429a44028e7496fe0a12f8c2 (patch)
tree849e144e00a29223333b24acc813306c6acb5ba2 /crates/hir_ty/src/op.rs
parent7c2dd85a32e320fd412a720ea5b847c66bf246ae (diff)
Inline TypeCtor into Ty
Diffstat (limited to 'crates/hir_ty/src/op.rs')
-rw-r--r--crates/hir_ty/src/op.rs39
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.
2use hir_def::expr::{ArithOp, BinaryOp, CmpOp}; 2use hir_def::expr::{ArithOp, BinaryOp, CmpOp};
3 3
4use super::{InferTy, Ty, TypeCtor}; 4use crate::{InferTy, Scalar, Ty};
5use crate::{ApplicationTy, Scalar};
6 5
7pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty { 6pub(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
34pub(super) fn binary_op_rhs_expectation(op: BinaryOp, lhs_ty: Ty) -> Ty { 27pub(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 },