aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/expr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/expr.rs')
-rw-r--r--crates/ra_hir/src/expr.rs43
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
5use std::sync::Arc; 5use std::sync::Arc;
6 6
7use ra_syntax::{ast, AstPtr}; 7use ra_syntax::AstPtr;
8 8
9use crate::{db::HirDatabase, DefWithBody, HasSource, Resolver}; 9use crate::{db::HirDatabase, DefWithBody, HasBody, Resolver};
10 10
11pub use hir_def::{ 11pub use hir_def::{
12 body::{ 12 body::{
@@ -19,48 +19,13 @@ pub use hir_def::{
19 }, 19 },
20}; 20};
21 21
22pub(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
48pub(crate) fn body_query(db: &impl HirDatabase, def: DefWithBody) -> Arc<Body> {
49 db.body_with_source_map(def).0
50}
51
52pub(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?
58pub(crate) fn resolver_for_expr( 23pub(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);