From 6c32bbf3ca5980fb33c1ea28dd1c5a1524ce81cb Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sat, 13 Mar 2021 14:44:51 +0100 Subject: Separate `Ty` and `TyKind` like in Chalk Currently `Ty` just wraps `TyKind`, but this allows us to change most places to already use `intern` / `interned`. --- crates/hir_ty/src/op.rs | 66 ++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 31 deletions(-) (limited to 'crates/hir_ty/src/op.rs') diff --git a/crates/hir_ty/src/op.rs b/crates/hir_ty/src/op.rs index bb9b8bbfc..527c5cbbd 100644 --- a/crates/hir_ty/src/op.rs +++ b/crates/hir_ty/src/op.rs @@ -2,51 +2,55 @@ use chalk_ir::TyVariableKind; use hir_def::expr::{ArithOp, BinaryOp, CmpOp}; -use crate::{Scalar, Ty}; +use crate::{Interner, Scalar, Ty, TyKind}; pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty { match op { - BinaryOp::LogicOp(_) | BinaryOp::CmpOp(_) => Ty::Scalar(Scalar::Bool), + BinaryOp::LogicOp(_) | BinaryOp::CmpOp(_) => TyKind::Scalar(Scalar::Bool).intern(&Interner), BinaryOp::Assignment { .. } => Ty::unit(), - BinaryOp::ArithOp(ArithOp::Shl) | BinaryOp::ArithOp(ArithOp::Shr) => match lhs_ty { - Ty::Scalar(Scalar::Int(_)) - | Ty::Scalar(Scalar::Uint(_)) - | Ty::Scalar(Scalar::Float(_)) => lhs_ty, - Ty::InferenceVar(_, TyVariableKind::Integer) - | Ty::InferenceVar(_, TyVariableKind::Float) => lhs_ty, - _ => Ty::Unknown, - }, - BinaryOp::ArithOp(_) => match rhs_ty { - Ty::Scalar(Scalar::Int(_)) - | Ty::Scalar(Scalar::Uint(_)) - | Ty::Scalar(Scalar::Float(_)) => rhs_ty, - Ty::InferenceVar(_, TyVariableKind::Integer) - | Ty::InferenceVar(_, TyVariableKind::Float) => rhs_ty, - _ => Ty::Unknown, + BinaryOp::ArithOp(ArithOp::Shl) | BinaryOp::ArithOp(ArithOp::Shr) => { + match lhs_ty.interned(&Interner) { + TyKind::Scalar(Scalar::Int(_)) + | TyKind::Scalar(Scalar::Uint(_)) + | TyKind::Scalar(Scalar::Float(_)) => lhs_ty, + TyKind::InferenceVar(_, TyVariableKind::Integer) + | TyKind::InferenceVar(_, TyVariableKind::Float) => lhs_ty, + _ => TyKind::Unknown.intern(&Interner), + } + } + BinaryOp::ArithOp(_) => match rhs_ty.interned(&Interner) { + TyKind::Scalar(Scalar::Int(_)) + | TyKind::Scalar(Scalar::Uint(_)) + | TyKind::Scalar(Scalar::Float(_)) => rhs_ty, + TyKind::InferenceVar(_, TyVariableKind::Integer) + | TyKind::InferenceVar(_, TyVariableKind::Float) => rhs_ty, + _ => TyKind::Unknown.intern(&Interner), }, } } pub(super) fn binary_op_rhs_expectation(op: BinaryOp, lhs_ty: Ty) -> Ty { match op { - BinaryOp::LogicOp(..) => Ty::Scalar(Scalar::Bool), + BinaryOp::LogicOp(..) => TyKind::Scalar(Scalar::Bool).intern(&Interner), BinaryOp::Assignment { op: None } => lhs_ty, - BinaryOp::CmpOp(CmpOp::Eq { .. }) => match lhs_ty { - Ty::Scalar(_) | Ty::Str => lhs_ty, - Ty::InferenceVar(_, TyVariableKind::Integer) - | Ty::InferenceVar(_, TyVariableKind::Float) => lhs_ty, - _ => Ty::Unknown, + BinaryOp::CmpOp(CmpOp::Eq { .. }) => match lhs_ty.interned(&Interner) { + TyKind::Scalar(_) | TyKind::Str => lhs_ty, + TyKind::InferenceVar(_, TyVariableKind::Integer) + | TyKind::InferenceVar(_, TyVariableKind::Float) => lhs_ty, + _ => TyKind::Unknown.intern(&Interner), }, - BinaryOp::ArithOp(ArithOp::Shl) | BinaryOp::ArithOp(ArithOp::Shr) => Ty::Unknown, + BinaryOp::ArithOp(ArithOp::Shl) | BinaryOp::ArithOp(ArithOp::Shr) => { + TyKind::Unknown.intern(&Interner) + } BinaryOp::CmpOp(CmpOp::Ord { .. }) | BinaryOp::Assignment { op: Some(_) } - | BinaryOp::ArithOp(_) => match lhs_ty { - Ty::Scalar(Scalar::Int(_)) - | Ty::Scalar(Scalar::Uint(_)) - | Ty::Scalar(Scalar::Float(_)) => lhs_ty, - Ty::InferenceVar(_, TyVariableKind::Integer) - | Ty::InferenceVar(_, TyVariableKind::Float) => lhs_ty, - _ => Ty::Unknown, + | BinaryOp::ArithOp(_) => match lhs_ty.interned(&Interner) { + TyKind::Scalar(Scalar::Int(_)) + | TyKind::Scalar(Scalar::Uint(_)) + | TyKind::Scalar(Scalar::Float(_)) => lhs_ty, + TyKind::InferenceVar(_, TyVariableKind::Integer) + | TyKind::InferenceVar(_, TyVariableKind::Float) => lhs_ty, + _ => TyKind::Unknown.intern(&Interner), }, } } -- cgit v1.2.3