aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_hir/src/expr.rs20
-rw-r--r--crates/ra_hir/src/expr/lower.rs6
-rw-r--r--crates/ra_hir/src/source_binder.rs2
-rw-r--r--crates/ra_hir/src/ty/infer.rs11
-rw-r--r--crates/ra_hir/src/ty/infer/expr.rs8
5 files changed, 19 insertions, 28 deletions
diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs
index dd2bae9b4..ddf605111 100644
--- a/crates/ra_hir/src/expr.rs
+++ b/crates/ra_hir/src/expr.rs
@@ -22,8 +22,6 @@ pub use hir_def::expr::{
22/// The body of an item (function, const etc.). 22/// The body of an item (function, const etc.).
23#[derive(Debug, Eq, PartialEq)] 23#[derive(Debug, Eq, PartialEq)]
24pub struct Body { 24pub struct Body {
25 /// The def of the item this body belongs to
26 owner: DefWithBody,
27 exprs: Arena<ExprId, Expr>, 25 exprs: Arena<ExprId, Expr>,
28 pats: Arena<PatId, Pat>, 26 pats: Arena<PatId, Pat>,
29 /// The patterns for the function's parameters. While the parameter types are 27 /// The patterns for the function's parameters. While the parameter types are
@@ -86,7 +84,7 @@ impl Body {
86 } 84 }
87 }; 85 };
88 86
89 let (body, source_map) = lower::lower(db, def.resolver(db), file_id, def, params, body); 87 let (body, source_map) = lower::lower(db, def.resolver(db), file_id, params, body);
90 (Arc::new(body), Arc::new(source_map)) 88 (Arc::new(body), Arc::new(source_map))
91 } 89 }
92 90
@@ -102,10 +100,6 @@ impl Body {
102 self.body_expr 100 self.body_expr
103 } 101 }
104 102
105 pub fn owner(&self) -> DefWithBody {
106 self.owner
107 }
108
109 pub fn exprs(&self) -> impl Iterator<Item = (ExprId, &Expr)> { 103 pub fn exprs(&self) -> impl Iterator<Item = (ExprId, &Expr)> {
110 self.exprs.iter() 104 self.exprs.iter()
111 } 105 }
@@ -117,21 +111,21 @@ impl Body {
117 111
118// needs arbitrary_self_types to be a method... or maybe move to the def? 112// needs arbitrary_self_types to be a method... or maybe move to the def?
119pub(crate) fn resolver_for_expr( 113pub(crate) fn resolver_for_expr(
120 body: Arc<Body>,
121 db: &impl HirDatabase, 114 db: &impl HirDatabase,
115 owner: DefWithBody,
122 expr_id: ExprId, 116 expr_id: ExprId,
123) -> Resolver { 117) -> Resolver {
124 let scopes = db.expr_scopes(body.owner); 118 let scopes = db.expr_scopes(owner);
125 resolver_for_scope(body, db, scopes.scope_for(expr_id)) 119 resolver_for_scope(db, owner, scopes.scope_for(expr_id))
126} 120}
127 121
128pub(crate) fn resolver_for_scope( 122pub(crate) fn resolver_for_scope(
129 body: Arc<Body>,
130 db: &impl HirDatabase, 123 db: &impl HirDatabase,
124 owner: DefWithBody,
131 scope_id: Option<scope::ScopeId>, 125 scope_id: Option<scope::ScopeId>,
132) -> Resolver { 126) -> Resolver {
133 let mut r = body.owner.resolver(db); 127 let mut r = owner.resolver(db);
134 let scopes = db.expr_scopes(body.owner); 128 let scopes = db.expr_scopes(owner);
135 let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>(); 129 let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>();
136 for scope in scope_chain.into_iter().rev() { 130 for scope in scope_chain.into_iter().rev() {
137 r = r.push_expr_scope(Arc::clone(&scopes), scope); 131 r = r.push_expr_scope(Arc::clone(&scopes), scope);
diff --git a/crates/ra_hir/src/expr/lower.rs b/crates/ra_hir/src/expr/lower.rs
index 7b0bfd919..adc68b23c 100644
--- a/crates/ra_hir/src/expr/lower.rs
+++ b/crates/ra_hir/src/expr/lower.rs
@@ -20,8 +20,8 @@ use ra_syntax::{
20use test_utils::tested_by; 20use test_utils::tested_by;
21 21
22use crate::{ 22use crate::{
23 db::HirDatabase, AstId, DefWithBody, Either, HirFileId, MacroCallLoc, MacroFileKind, 23 db::HirDatabase, AstId, Either, HirFileId, MacroCallLoc, MacroFileKind, Mutability, Path,
24 Mutability, Path, Resolver, Source, 24 Resolver, Source,
25}; 25};
26 26
27use super::{ 27use super::{
@@ -33,7 +33,6 @@ pub(super) fn lower(
33 db: &impl HirDatabase, 33 db: &impl HirDatabase,
34 resolver: Resolver, 34 resolver: Resolver,
35 file_id: HirFileId, 35 file_id: HirFileId,
36 owner: DefWithBody,
37 params: Option<ast::ParamList>, 36 params: Option<ast::ParamList>,
38 body: Option<ast::Expr>, 37 body: Option<ast::Expr>,
39) -> (Body, BodySourceMap) { 38) -> (Body, BodySourceMap) {
@@ -44,7 +43,6 @@ pub(super) fn lower(
44 current_file_id: file_id, 43 current_file_id: file_id,
45 source_map: BodySourceMap::default(), 44 source_map: BodySourceMap::default(),
46 body: Body { 45 body: Body {
47 owner,
48 exprs: Arena::default(), 46 exprs: Arena::default(),
49 pats: Arena::default(), 47 pats: Arena::default(),
50 params: Vec::new(), 48 params: Vec::new(),
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs
index fe4211819..f28e9c931 100644
--- a/crates/ra_hir/src/source_binder.rs
+++ b/crates/ra_hir/src/source_binder.rs
@@ -150,7 +150,7 @@ impl SourceAnalyzer {
150 None => scope_for(&scopes, &source_map, &node), 150 None => scope_for(&scopes, &source_map, &node),
151 Some(offset) => scope_for_offset(&scopes, &source_map, file_id.into(), offset), 151 Some(offset) => scope_for_offset(&scopes, &source_map, file_id.into(), offset),
152 }; 152 };
153 let resolver = expr::resolver_for_scope(def.body(db), db, scope); 153 let resolver = expr::resolver_for_scope(db, def, scope);
154 SourceAnalyzer { 154 SourceAnalyzer {
155 resolver, 155 resolver,
156 body_owner: Some(def), 156 body_owner: Some(def),
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs
index 2370e8d4f..f17c6c614 100644
--- a/crates/ra_hir/src/ty/infer.rs
+++ b/crates/ra_hir/src/ty/infer.rs
@@ -43,7 +43,7 @@ use crate::{
43 expr::{BindingAnnotation, Body, ExprId, PatId}, 43 expr::{BindingAnnotation, Body, ExprId, PatId},
44 resolve::{Resolver, TypeNs}, 44 resolve::{Resolver, TypeNs},
45 ty::infer::diagnostics::InferenceDiagnostic, 45 ty::infer::diagnostics::InferenceDiagnostic,
46 Adt, AssocItem, ConstData, DefWithBody, FnData, Function, HasBody, Path, StructField, 46 Adt, AssocItem, ConstData, DefWithBody, FnData, Function, Path, StructField,
47}; 47};
48 48
49macro_rules! ty_app { 49macro_rules! ty_app {
@@ -64,9 +64,8 @@ mod coerce;
64/// The entry point of type inference. 64/// The entry point of type inference.
65pub fn infer_query(db: &impl HirDatabase, def: DefWithBody) -> Arc<InferenceResult> { 65pub fn infer_query(db: &impl HirDatabase, def: DefWithBody) -> Arc<InferenceResult> {
66 let _p = profile("infer_query"); 66 let _p = profile("infer_query");
67 let body = def.body(db);
68 let resolver = def.resolver(db); 67 let resolver = def.resolver(db);
69 let mut ctx = InferenceContext::new(db, body, resolver); 68 let mut ctx = InferenceContext::new(db, def, resolver);
70 69
71 match def { 70 match def {
72 DefWithBody::Const(ref c) => ctx.collect_const(&c.data(db)), 71 DefWithBody::Const(ref c) => ctx.collect_const(&c.data(db)),
@@ -187,6 +186,7 @@ impl Index<PatId> for InferenceResult {
187#[derive(Clone, Debug)] 186#[derive(Clone, Debug)]
188struct InferenceContext<'a, D: HirDatabase> { 187struct InferenceContext<'a, D: HirDatabase> {
189 db: &'a D, 188 db: &'a D,
189 owner: DefWithBody,
190 body: Arc<Body>, 190 body: Arc<Body>,
191 resolver: Resolver, 191 resolver: Resolver,
192 var_unification_table: InPlaceUnificationTable<TypeVarId>, 192 var_unification_table: InPlaceUnificationTable<TypeVarId>,
@@ -204,7 +204,7 @@ struct InferenceContext<'a, D: HirDatabase> {
204} 204}
205 205
206impl<'a, D: HirDatabase> InferenceContext<'a, D> { 206impl<'a, D: HirDatabase> InferenceContext<'a, D> {
207 fn new(db: &'a D, body: Arc<Body>, resolver: Resolver) -> Self { 207 fn new(db: &'a D, owner: DefWithBody, resolver: Resolver) -> Self {
208 InferenceContext { 208 InferenceContext {
209 result: InferenceResult::default(), 209 result: InferenceResult::default(),
210 var_unification_table: InPlaceUnificationTable::new(), 210 var_unification_table: InPlaceUnificationTable::new(),
@@ -213,7 +213,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
213 trait_env: lower::trait_env(db, &resolver), 213 trait_env: lower::trait_env(db, &resolver),
214 coerce_unsized_map: Self::init_coerce_unsized_map(db, &resolver), 214 coerce_unsized_map: Self::init_coerce_unsized_map(db, &resolver),
215 db, 215 db,
216 body, 216 owner,
217 body: db.body(owner),
217 resolver, 218 resolver,
218 } 219 }
219 } 220 }
diff --git a/crates/ra_hir/src/ty/infer/expr.rs b/crates/ra_hir/src/ty/infer/expr.rs
index 6d9792391..c6802487a 100644
--- a/crates/ra_hir/src/ty/infer/expr.rs
+++ b/crates/ra_hir/src/ty/infer/expr.rs
@@ -130,10 +130,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
130 TypeCtor::FnPtr { num_args: sig_tys.len() as u16 - 1 }, 130 TypeCtor::FnPtr { num_args: sig_tys.len() as u16 - 1 },
131 Substs(sig_tys.into()), 131 Substs(sig_tys.into()),
132 ); 132 );
133 let closure_ty = Ty::apply_one( 133 let closure_ty =
134 TypeCtor::Closure { def: self.body.owner(), expr: tgt_expr }, 134 Ty::apply_one(TypeCtor::Closure { def: self.owner, expr: tgt_expr }, sig_ty);
135 sig_ty,
136 );
137 135
138 // Eagerly try to relate the closure type with the expected 136 // Eagerly try to relate the closure type with the expected
139 // type, otherwise we often won't have enough information to 137 // type, otherwise we often won't have enough information to
@@ -184,7 +182,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
184 } 182 }
185 Expr::Path(p) => { 183 Expr::Path(p) => {
186 // FIXME this could be more efficient... 184 // FIXME this could be more efficient...
187 let resolver = expr::resolver_for_expr(self.body.clone(), self.db, tgt_expr); 185 let resolver = expr::resolver_for_expr(self.db, self.owner, tgt_expr);
188 self.infer_path(&resolver, p, tgt_expr.into()).unwrap_or(Ty::Unknown) 186 self.infer_path(&resolver, p, tgt_expr.into()).unwrap_or(Ty::Unknown)
189 } 187 }
190 Expr::Continue => Ty::simple(TypeCtor::Never), 188 Expr::Continue => Ty::simple(TypeCtor::Never),