Remove Ty::substs{_mut}

Almost all uses actually only care about ADT substs, so it's better to
be explicit. The methods were a bad abstraction anyway since they
already didn't include the inner types of e.g. `TyKind::Ref` anymore.
This commit is contained in:
Florian Diebold 2021-04-07 17:26:01 +02:00
parent 8e900cb4a1
commit 92dcc53f94
6 changed files with 45 additions and 52 deletions

View file

@ -412,7 +412,10 @@ impl<'a> InferenceContext<'a> {
self.unify(&ty, &expected.ty);
let substs = ty.substs().cloned().unwrap_or_else(|| Substitution::empty(&Interner));
let substs = ty
.as_adt()
.map(|(_, s)| s.clone())
.unwrap_or_else(|| Substitution::empty(&Interner));
let field_types = def_id.map(|it| self.db.field_types(it)).unwrap_or_default();
let variant_data = def_id.map(|it| it.variant_data(self.db.upcast()));
for field in fields.iter() {

View file

@ -33,7 +33,8 @@ impl<'a> InferenceContext<'a> {
}
self.unify(&ty, expected);
let substs = ty.substs().cloned().unwrap_or_else(|| Substitution::empty(&Interner));
let substs =
ty.as_adt().map(|(_, s)| s.clone()).unwrap_or_else(|| Substitution::empty(&Interner));
let field_tys = def.map(|it| self.db.field_types(it)).unwrap_or_default();
let (pre, post) = match ellipsis {
@ -74,7 +75,8 @@ impl<'a> InferenceContext<'a> {
self.unify(&ty, expected);
let substs = ty.substs().cloned().unwrap_or_else(|| Substitution::empty(&Interner));
let substs =
ty.as_adt().map(|(_, s)| s.clone()).unwrap_or_else(|| Substitution::empty(&Interner));
let field_tys = def.map(|it| self.db.field_types(it)).unwrap_or_default();
for subpat in subpats {

View file

@ -198,34 +198,6 @@ impl Ty {
_ => false,
}
}
/// Returns the type parameters of this type if it has some (i.e. is an ADT
/// or function); so if `self` is `Option<u32>`, this returns the `u32`.
pub fn substs(&self) -> Option<&Substitution> {
match self.kind(&Interner) {
TyKind::Adt(_, substs)
| TyKind::FnDef(_, substs)
| TyKind::Tuple(_, substs)
| TyKind::OpaqueType(_, substs)
| TyKind::AssociatedType(_, substs)
| TyKind::Closure(.., substs) => Some(substs),
TyKind::Function(FnPointer { substitution: substs, .. }) => Some(&substs.0),
_ => None,
}
}
fn substs_mut(&mut self) -> Option<&mut Substitution> {
match self.interned_mut() {
TyKind::Adt(_, substs)
| TyKind::FnDef(_, substs)
| TyKind::Tuple(_, substs)
| TyKind::OpaqueType(_, substs)
| TyKind::AssociatedType(_, substs)
| TyKind::Closure(.., substs) => Some(substs),
TyKind::Function(FnPointer { substitution: substs, .. }) => Some(&mut substs.0),
_ => None,
}
}
}
#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash)]

View file

@ -162,13 +162,15 @@ impl TypeWalk for Ty {
TyKind::Function(fn_pointer) => {
fn_pointer.substitution.0.walk(f);
}
_ => {
if let Some(substs) = self.substs() {
for t in substs.iter(&Interner) {
t.walk(f);
}
}
TyKind::Adt(_, substs)
| TyKind::FnDef(_, substs)
| TyKind::Tuple(_, substs)
| TyKind::OpaqueType(_, substs)
| TyKind::AssociatedType(_, substs)
| TyKind::Closure(.., substs) => {
substs.walk(f);
}
_ => {}
}
f(self);
}
@ -199,11 +201,15 @@ impl TypeWalk for Ty {
TyKind::Function(fn_pointer) => {
fn_pointer.substitution.0.walk_mut_binders(f, binders.shifted_in());
}
_ => {
if let Some(substs) = self.substs_mut() {
substs.walk_mut_binders(f, binders);
}
TyKind::Adt(_, substs)
| TyKind::FnDef(_, substs)
| TyKind::Tuple(_, substs)
| TyKind::OpaqueType(_, substs)
| TyKind::AssociatedType(_, substs)
| TyKind::Closure(.., substs) => {
substs.walk_mut_binders(f, binders);
}
_ => {}
}
f(self, binders);
}