diff options
Diffstat (limited to 'crates/hir/src')
-rw-r--r-- | crates/hir/src/lib.rs | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index eb1cd66fb..c0810c69b 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs | |||
@@ -1598,7 +1598,7 @@ impl Type { | |||
1598 | 1598 | ||
1599 | pub fn remove_ref(&self) -> Option<Type> { | 1599 | pub fn remove_ref(&self) -> Option<Type> { |
1600 | match &self.ty.value.interned(&Interner) { | 1600 | match &self.ty.value.interned(&Interner) { |
1601 | TyKind::Ref(.., substs) => Some(self.derived(substs[0].clone())), | 1601 | TyKind::Ref(.., ty) => Some(self.derived(ty.clone())), |
1602 | _ => None, | 1602 | _ => None, |
1603 | } | 1603 | } |
1604 | } | 1604 | } |
@@ -1752,10 +1752,30 @@ impl Type { | |||
1752 | return go(&self.ty.value); | 1752 | return go(&self.ty.value); |
1753 | 1753 | ||
1754 | fn go(ty: &Ty) -> bool { | 1754 | fn go(ty: &Ty) -> bool { |
1755 | if ty.is_unknown() { | 1755 | match ty.interned(&Interner) { |
1756 | true | 1756 | TyKind::Unknown => true, |
1757 | } else { | 1757 | |
1758 | ty.substs().map_or(false, |substs| substs.iter().any(go)) | 1758 | TyKind::Adt(_, substs) |
1759 | | TyKind::AssociatedType(_, substs) | ||
1760 | | TyKind::Tuple(_, substs) | ||
1761 | | TyKind::OpaqueType(_, substs) | ||
1762 | | TyKind::FnDef(_, substs) | ||
1763 | | TyKind::Closure(_, substs) => substs.iter().any(go), | ||
1764 | |||
1765 | TyKind::Array(ty) | TyKind::Slice(ty) | TyKind::Raw(_, ty) | TyKind::Ref(_, ty) => { | ||
1766 | go(ty) | ||
1767 | } | ||
1768 | |||
1769 | TyKind::Scalar(_) | ||
1770 | | TyKind::Str | ||
1771 | | TyKind::Never | ||
1772 | | TyKind::Placeholder(_) | ||
1773 | | TyKind::BoundVar(_) | ||
1774 | | TyKind::InferenceVar(_, _) | ||
1775 | | TyKind::Dyn(_) | ||
1776 | | TyKind::Function(_) | ||
1777 | | TyKind::Alias(_) | ||
1778 | | TyKind::ForeignType(_) => false, | ||
1759 | } | 1779 | } |
1760 | } | 1780 | } |
1761 | } | 1781 | } |
@@ -1990,6 +2010,10 @@ impl Type { | |||
1990 | walk_bounds(db, &type_.derived(ty.clone()), bounds.as_ref(), cb); | 2010 | walk_bounds(db, &type_.derived(ty.clone()), bounds.as_ref(), cb); |
1991 | } | 2011 | } |
1992 | 2012 | ||
2013 | TyKind::Ref(_, ty) | TyKind::Raw(_, ty) | TyKind::Array(ty) | TyKind::Slice(ty) => { | ||
2014 | walk_type(db, &type_.derived(ty.clone()), cb); | ||
2015 | } | ||
2016 | |||
1993 | _ => {} | 2017 | _ => {} |
1994 | } | 2018 | } |
1995 | if let Some(substs) = ty.substs() { | 2019 | if let Some(substs) = ty.substs() { |