diff options
Diffstat (limited to 'crates/ra_hir/src/expr.rs')
-rw-r--r-- | crates/ra_hir/src/expr.rs | 43 |
1 files changed, 4 insertions, 39 deletions
diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs index f02104b2d..9262325f2 100644 --- a/crates/ra_hir/src/expr.rs +++ b/crates/ra_hir/src/expr.rs | |||
@@ -4,9 +4,9 @@ pub(crate) mod validation; | |||
4 | 4 | ||
5 | use std::sync::Arc; | 5 | use std::sync::Arc; |
6 | 6 | ||
7 | use ra_syntax::{ast, AstPtr}; | 7 | use ra_syntax::AstPtr; |
8 | 8 | ||
9 | use crate::{db::HirDatabase, DefWithBody, HasSource, Resolver}; | 9 | use crate::{db::HirDatabase, DefWithBody, HasBody, Resolver}; |
10 | 10 | ||
11 | pub use hir_def::{ | 11 | pub use hir_def::{ |
12 | body::{ | 12 | body::{ |
@@ -19,48 +19,13 @@ pub use hir_def::{ | |||
19 | }, | 19 | }, |
20 | }; | 20 | }; |
21 | 21 | ||
22 | pub(crate) fn body_with_source_map_query( | ||
23 | db: &impl HirDatabase, | ||
24 | def: DefWithBody, | ||
25 | ) -> (Arc<Body>, Arc<BodySourceMap>) { | ||
26 | let mut params = None; | ||
27 | |||
28 | let (file_id, body) = match def { | ||
29 | DefWithBody::Function(f) => { | ||
30 | let src = f.source(db); | ||
31 | params = src.ast.param_list(); | ||
32 | (src.file_id, src.ast.body().map(ast::Expr::from)) | ||
33 | } | ||
34 | DefWithBody::Const(c) => { | ||
35 | let src = c.source(db); | ||
36 | (src.file_id, src.ast.body()) | ||
37 | } | ||
38 | DefWithBody::Static(s) => { | ||
39 | let src = s.source(db); | ||
40 | (src.file_id, src.ast.body()) | ||
41 | } | ||
42 | }; | ||
43 | let expander = hir_def::body::Expander::new(db, file_id, def.module(db).id); | ||
44 | let (body, source_map) = Body::new(db, expander, params, body); | ||
45 | (Arc::new(body), Arc::new(source_map)) | ||
46 | } | ||
47 | |||
48 | pub(crate) fn body_query(db: &impl HirDatabase, def: DefWithBody) -> Arc<Body> { | ||
49 | db.body_with_source_map(def).0 | ||
50 | } | ||
51 | |||
52 | pub(crate) fn expr_scopes_query(db: &impl HirDatabase, def: DefWithBody) -> Arc<ExprScopes> { | ||
53 | let body = db.body(def); | ||
54 | Arc::new(ExprScopes::new(&*body)) | ||
55 | } | ||
56 | |||
57 | // needs arbitrary_self_types to be a method... or maybe move to the def? | 22 | // needs arbitrary_self_types to be a method... or maybe move to the def? |
58 | pub(crate) fn resolver_for_expr( | 23 | pub(crate) fn resolver_for_expr( |
59 | db: &impl HirDatabase, | 24 | db: &impl HirDatabase, |
60 | owner: DefWithBody, | 25 | owner: DefWithBody, |
61 | expr_id: ExprId, | 26 | expr_id: ExprId, |
62 | ) -> Resolver { | 27 | ) -> Resolver { |
63 | let scopes = db.expr_scopes(owner); | 28 | let scopes = owner.expr_scopes(db); |
64 | resolver_for_scope(db, owner, scopes.scope_for(expr_id)) | 29 | resolver_for_scope(db, owner, scopes.scope_for(expr_id)) |
65 | } | 30 | } |
66 | 31 | ||
@@ -70,7 +35,7 @@ pub(crate) fn resolver_for_scope( | |||
70 | scope_id: Option<ScopeId>, | 35 | scope_id: Option<ScopeId>, |
71 | ) -> Resolver { | 36 | ) -> Resolver { |
72 | let mut r = owner.resolver(db); | 37 | let mut r = owner.resolver(db); |
73 | let scopes = db.expr_scopes(owner); | 38 | let scopes = owner.expr_scopes(db); |
74 | let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>(); | 39 | let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>(); |
75 | for scope in scope_chain.into_iter().rev() { | 40 | for scope in scope_chain.into_iter().rev() { |
76 | r = r.push_expr_scope(Arc::clone(&scopes), scope); | 41 | r = r.push_expr_scope(Arc::clone(&scopes), scope); |