Skip to content

Commit b0fe3d9

Browse files
committed
Add TyBuilder::unit() and TyExt::is_unit()
1 parent b15152c commit b0fe3d9

File tree

7 files changed

+39
-25
lines changed

7 files changed

+39
-25
lines changed

crates/hir_ty/src/chalk_ext.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//! Various extensions traits for Chalk types.
2+
3+
use crate::{Interner, Ty, TyKind};
4+
5+
pub trait TyExt {
6+
fn is_unit(&self) -> bool;
7+
}
8+
9+
impl TyExt for Ty {
10+
fn is_unit(&self) -> bool {
11+
matches!(self.kind(&Interner), TyKind::Tuple(0, _))
12+
}
13+
}

crates/hir_ty/src/diagnostics/expr.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::{
1515
MissingPatFields, RemoveThisSemicolon,
1616
},
1717
utils::variant_data,
18-
AdtId, InferenceResult, Interner, Ty, TyKind,
18+
AdtId, InferenceResult, Interner, TyExt, TyKind,
1919
};
2020

2121
pub(crate) use hir_def::{
@@ -423,7 +423,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> {
423423
None => return,
424424
};
425425

426-
if mismatch.actual != Ty::unit() || mismatch.expected != *possible_tail_ty {
426+
if !mismatch.actual.is_unit() || mismatch.expected != *possible_tail_ty {
427427
return;
428428
}
429429

crates/hir_ty/src/display.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ use crate::{
1919
db::HirDatabase, from_assoc_type_id, from_foreign_def_id, from_placeholder_idx, primitive,
2020
to_assoc_type_id, traits::chalk::from_chalk, utils::generics, AdtId, AliasEq, AliasTy,
2121
CallableDefId, CallableSig, DomainGoal, GenericArg, ImplTraitId, Interner, Lifetime, OpaqueTy,
22-
ProjectionTy, QuantifiedWhereClause, Scalar, Substitution, TraitRef, Ty, TyKind, WhereClause,
22+
ProjectionTy, QuantifiedWhereClause, Scalar, Substitution, TraitRef, Ty, TyExt, TyKind,
23+
WhereClause,
2324
};
2425

2526
pub struct HirFormatter<'a> {
@@ -423,7 +424,7 @@ impl HirDisplay for Ty {
423424
f.write_joined(sig.params(), ", ")?;
424425
write!(f, ")")?;
425426
let ret = sig.ret();
426-
if *ret != Ty::unit() {
427+
if !ret.is_unit() {
427428
let ret_display = ret.into_displayable(
428429
f.db,
429430
f.max_size,
@@ -663,7 +664,7 @@ impl HirDisplay for CallableSig {
663664
}
664665
write!(f, ")")?;
665666
let ret = self.ret();
666-
if *ret != Ty::unit() {
667+
if !ret.is_unit() {
667668
let ret_display =
668669
ret.into_displayable(f.db, f.max_size, f.omit_verbose_types, f.display_target);
669670
write!(f, " -> {}", ret_display)?;

crates/hir_ty/src/infer/expr.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::{
2323
traits::{chalk::from_chalk, FnTrait, InEnvironment},
2424
utils::{generics, variant_data, Generics},
2525
AdtId, Binders, CallableDefId, DomainGoal, FnPointer, FnSig, Interner, Rawness, Scalar,
26-
Substitution, TraitRef, Ty, TyKind,
26+
Substitution, TraitRef, Ty, TyBuilder, TyKind,
2727
};
2828

2929
use super::{
@@ -138,7 +138,7 @@ impl<'a> InferenceContext<'a> {
138138
both_arms_diverge &= mem::replace(&mut self.diverges, Diverges::Maybe);
139139
let else_ty = match else_branch {
140140
Some(else_branch) => self.infer_expr_inner(*else_branch, &expected),
141-
None => Ty::unit(),
141+
None => TyBuilder::unit(),
142142
};
143143
both_arms_diverge &= self.diverges;
144144

@@ -193,7 +193,7 @@ impl<'a> InferenceContext<'a> {
193193
break_ty: self.table.new_type_var(),
194194
label: label.map(|label| self.body[label].name.clone()),
195195
});
196-
self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
196+
self.infer_expr(*body, &Expectation::has_type(TyBuilder::unit()));
197197

198198
let ctxt = self.breakables.pop().expect("breakable stack broken");
199199
if ctxt.may_break {
@@ -217,11 +217,11 @@ impl<'a> InferenceContext<'a> {
217217
*condition,
218218
&Expectation::has_type(TyKind::Scalar(Scalar::Bool).intern(&Interner)),
219219
);
220-
self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
220+
self.infer_expr(*body, &Expectation::has_type(TyBuilder::unit()));
221221
let _ctxt = self.breakables.pop().expect("breakable stack broken");
222222
// the body may not run, so it diverging doesn't mean we diverge
223223
self.diverges = Diverges::Maybe;
224-
Ty::unit()
224+
TyBuilder::unit()
225225
}
226226
Expr::For { iterable, body, pat, label } => {
227227
let iterable_ty = self.infer_expr(*iterable, &Expectation::none());
@@ -236,11 +236,11 @@ impl<'a> InferenceContext<'a> {
236236

237237
self.infer_pat(*pat, &pat_ty, BindingMode::default());
238238

239-
self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
239+
self.infer_expr(*body, &Expectation::has_type(TyBuilder::unit()));
240240
let _ctxt = self.breakables.pop().expect("breakable stack broken");
241241
// the body may not run, so it diverging doesn't mean we diverge
242242
self.diverges = Diverges::Maybe;
243-
Ty::unit()
243+
TyBuilder::unit()
244244
}
245245
Expr::Lambda { body, args, ret_type, arg_types } => {
246246
assert_eq!(args.len(), arg_types.len());
@@ -360,7 +360,7 @@ impl<'a> InferenceContext<'a> {
360360
let val_ty = if let Some(expr) = expr {
361361
self.infer_expr(*expr, &Expectation::none())
362362
} else {
363-
Ty::unit()
363+
TyBuilder::unit()
364364
};
365365

366366
let last_ty =
@@ -386,7 +386,7 @@ impl<'a> InferenceContext<'a> {
386386
if let Some(expr) = expr {
387387
self.infer_expr_coerce(*expr, &Expectation::has_type(self.return_ty.clone()));
388388
} else {
389-
let unit = Ty::unit();
389+
let unit = TyBuilder::unit();
390390
self.coerce(&unit, &self.return_ty.clone());
391391
}
392392
TyKind::Never.intern(&Interner)
@@ -828,8 +828,8 @@ impl<'a> InferenceContext<'a> {
828828
// we don't even make an attempt at coercion
829829
self.table.new_maybe_never_var()
830830
} else {
831-
self.coerce(&Ty::unit(), &expected.coercion_target());
832-
Ty::unit()
831+
self.coerce(&TyBuilder::unit(), &expected.coercion_target());
832+
TyBuilder::unit()
833833
}
834834
};
835835
ty

crates/hir_ty/src/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub mod diagnostics;
2323
mod tests;
2424
#[cfg(test)]
2525
mod test_db;
26+
mod chalk_ext;
2627

2728
use std::{iter, mem, sync::Arc};
2829

@@ -42,6 +43,7 @@ use crate::{
4243
};
4344

4445
pub use autoderef::autoderef;
46+
pub use chalk_ext::TyExt;
4547
pub use infer::{could_unify, InferenceResult, InferenceVar};
4648
pub use lower::{
4749
associated_type_shorthand_candidates, callable_item_sig, CallableDefId, ImplTraitLoweringMode,
@@ -813,14 +815,12 @@ impl TypeWalk for CallableSig {
813815
struct TyBuilder {}
814816

815817
impl TyBuilder {
816-
817-
}
818-
819-
impl Ty {
820-
pub fn unit() -> Self {
818+
pub fn unit() -> Ty {
821819
TyKind::Tuple(0, Substitution::empty(&Interner)).intern(&Interner)
822820
}
821+
}
823822

823+
impl Ty {
824824
pub fn adt_ty(adt: hir_def::AdtId, substs: Substitution) -> Ty {
825825
TyKind::Adt(AdtId(adt), substs).intern(&Interner)
826826
}

crates/hir_ty/src/op.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
use chalk_ir::TyVariableKind;
33
use hir_def::expr::{ArithOp, BinaryOp, CmpOp};
44

5-
use crate::{Interner, Scalar, Ty, TyKind};
5+
use crate::{Interner, Scalar, Ty, TyBuilder, TyKind};
66

77
pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty {
88
match op {
99
BinaryOp::LogicOp(_) | BinaryOp::CmpOp(_) => TyKind::Scalar(Scalar::Bool).intern(&Interner),
10-
BinaryOp::Assignment { .. } => Ty::unit(),
10+
BinaryOp::Assignment { .. } => TyBuilder::unit(),
1111
BinaryOp::ArithOp(ArithOp::Shl) | BinaryOp::ArithOp(ArithOp::Shr) => {
1212
match lhs_ty.kind(&Interner) {
1313
TyKind::Scalar(Scalar::Int(_))

crates/hir_ty/src/traits/chalk.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::{
2222
to_assoc_type_id, to_chalk_trait_id,
2323
utils::generics,
2424
AliasEq, AliasTy, BoundVar, CallableDefId, DebruijnIndex, FnDefId, ProjectionTy, Substitution,
25-
TraitRef, Ty, TyKind, WhereClause,
25+
TraitRef, Ty, TyBuilder, TyKind, WhereClause,
2626
};
2727
use mapping::{
2828
convert_where_clauses, generic_predicate_to_inline_bound, make_binders, TypeAliasAsValue,
@@ -300,7 +300,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
300300
_closure_id: chalk_ir::ClosureId<Interner>,
301301
_substs: &chalk_ir::Substitution<Interner>,
302302
) -> chalk_ir::Binders<chalk_ir::Ty<Interner>> {
303-
let ty = Ty::unit().to_chalk(self.db);
303+
let ty = TyBuilder::unit().to_chalk(self.db);
304304
make_binders(ty, 0)
305305
}
306306
fn closure_fn_substitution(

0 commit comments

Comments
 (0)