diff options
Diffstat (limited to 'crates/hir')
-rw-r--r-- | crates/hir/src/lib.rs | 34 | ||||
-rw-r--r-- | crates/hir/src/source_analyzer.rs | 24 |
2 files changed, 32 insertions, 26 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index caa760d21..25e5bfb01 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs | |||
@@ -1597,7 +1597,7 @@ impl Type { | |||
1597 | 1597 | ||
1598 | pub fn remove_ref(&self) -> Option<Type> { | 1598 | pub fn remove_ref(&self) -> Option<Type> { |
1599 | match &self.ty.value.interned(&Interner) { | 1599 | match &self.ty.value.interned(&Interner) { |
1600 | TyKind::Ref(.., substs) => Some(self.derived(substs[0].clone())), | 1600 | TyKind::Ref(.., ty) => Some(self.derived(ty.clone())), |
1601 | _ => None, | 1601 | _ => None, |
1602 | } | 1602 | } |
1603 | } | 1603 | } |
@@ -1751,10 +1751,30 @@ impl Type { | |||
1751 | return go(&self.ty.value); | 1751 | return go(&self.ty.value); |
1752 | 1752 | ||
1753 | fn go(ty: &Ty) -> bool { | 1753 | fn go(ty: &Ty) -> bool { |
1754 | if ty.is_unknown() { | 1754 | match ty.interned(&Interner) { |
1755 | true | 1755 | TyKind::Unknown => true, |
1756 | } else { | 1756 | |
1757 | ty.substs().map_or(false, |substs| substs.iter().any(go)) | 1757 | TyKind::Adt(_, substs) |
1758 | | TyKind::AssociatedType(_, substs) | ||
1759 | | TyKind::Tuple(_, substs) | ||
1760 | | TyKind::OpaqueType(_, substs) | ||
1761 | | TyKind::FnDef(_, substs) | ||
1762 | | TyKind::Closure(_, substs) => substs.iter().any(go), | ||
1763 | |||
1764 | TyKind::Array(ty) | TyKind::Slice(ty) | TyKind::Raw(_, ty) | TyKind::Ref(_, ty) => { | ||
1765 | go(ty) | ||
1766 | } | ||
1767 | |||
1768 | TyKind::Scalar(_) | ||
1769 | | TyKind::Str | ||
1770 | | TyKind::Never | ||
1771 | | TyKind::Placeholder(_) | ||
1772 | | TyKind::BoundVar(_) | ||
1773 | | TyKind::InferenceVar(_, _) | ||
1774 | | TyKind::Dyn(_) | ||
1775 | | TyKind::Function(_) | ||
1776 | | TyKind::Alias(_) | ||
1777 | | TyKind::ForeignType(_) => false, | ||
1758 | } | 1778 | } |
1759 | } | 1779 | } |
1760 | } | 1780 | } |
@@ -1989,6 +2009,10 @@ impl Type { | |||
1989 | walk_bounds(db, &type_.derived(ty.clone()), bounds.as_ref(), cb); | 2009 | walk_bounds(db, &type_.derived(ty.clone()), bounds.as_ref(), cb); |
1990 | } | 2010 | } |
1991 | 2011 | ||
2012 | TyKind::Ref(_, ty) | TyKind::Raw(_, ty) | TyKind::Array(ty) | TyKind::Slice(ty) => { | ||
2013 | walk_type(db, &type_.derived(ty.clone()), cb); | ||
2014 | } | ||
2015 | |||
1992 | _ => {} | 2016 | _ => {} |
1993 | } | 2017 | } |
1994 | if let Some(substs) = ty.substs() { | 2018 | if let Some(substs) = ty.substs() { |
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index 055a3e5d0..4d59293e9 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs | |||
@@ -24,7 +24,7 @@ use hir_ty::{ | |||
24 | }; | 24 | }; |
25 | use syntax::{ | 25 | use syntax::{ |
26 | ast::{self, AstNode}, | 26 | ast::{self, AstNode}, |
27 | AstPtr, SyntaxNode, TextRange, TextSize, | 27 | SyntaxNode, TextRange, TextSize, |
28 | }; | 28 | }; |
29 | 29 | ||
30 | use crate::{ | 30 | use crate::{ |
@@ -161,26 +161,8 @@ impl SourceAnalyzer { | |||
161 | db: &dyn HirDatabase, | 161 | db: &dyn HirDatabase, |
162 | field: &ast::RecordExprField, | 162 | field: &ast::RecordExprField, |
163 | ) -> Option<(Field, Option<Local>)> { | 163 | ) -> Option<(Field, Option<Local>)> { |
164 | let expr_id = { | 164 | let expr_id = |
165 | let record_lit = field.parent_record_lit(); | 165 | self.body_source_map.as_ref()?.node_field(InFile::new(self.file_id, field))?; |
166 | let record_lit_expr = self.expr_id(db, &ast::Expr::from(record_lit))?; | ||
167 | let body = self.body.as_ref()?; | ||
168 | let body_source_map = self.body_source_map.as_ref()?; | ||
169 | match &body[record_lit_expr] { | ||
170 | hir_def::expr::Expr::RecordLit { fields, .. } => { | ||
171 | let field_ptr = InFile::new(self.file_id, AstPtr::new(field)); | ||
172 | fields.iter().enumerate().find_map(|(i, f)| { | ||
173 | let ptr = body_source_map.field_syntax(record_lit_expr, i); | ||
174 | if ptr == field_ptr { | ||
175 | Some(f.expr) | ||
176 | } else { | ||
177 | None | ||
178 | } | ||
179 | })? | ||
180 | } | ||
181 | _ => return None, | ||
182 | } | ||
183 | }; | ||
184 | 166 | ||
185 | let local = if field.name_ref().is_some() { | 167 | let local = if field.name_ref().is_some() { |
186 | None | 168 | None |