aboutsummaryrefslogtreecommitdiff
path: root/crates/hir
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir')
-rw-r--r--crates/hir/src/lib.rs34
-rw-r--r--crates/hir/src/source_analyzer.rs24
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};
25use syntax::{ 25use syntax::{
26 ast::{self, AstNode}, 26 ast::{self, AstNode},
27 AstPtr, SyntaxNode, TextRange, TextSize, 27 SyntaxNode, TextRange, TextSize,
28}; 28};
29 29
30use crate::{ 30use 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