aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/expr
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/expr')
-rw-r--r--crates/ra_hir/src/expr/scope.rs23
1 files changed, 9 insertions, 14 deletions
diff --git a/crates/ra_hir/src/expr/scope.rs b/crates/ra_hir/src/expr/scope.rs
index 0e49a28d6..fe5e836f2 100644
--- a/crates/ra_hir/src/expr/scope.rs
+++ b/crates/ra_hir/src/expr/scope.rs
@@ -17,7 +17,6 @@ impl_arena_id!(ScopeId);
17 17
18#[derive(Debug, PartialEq, Eq)] 18#[derive(Debug, PartialEq, Eq)]
19pub struct ExprScopes { 19pub struct ExprScopes {
20 pub(crate) body: Arc<Body>,
21 scopes: Arena<ScopeId, ScopeData>, 20 scopes: Arena<ScopeId, ScopeData>,
22 scope_by_expr: FxHashMap<ExprId, ScopeId>, 21 scope_by_expr: FxHashMap<ExprId, ScopeId>,
23} 22}
@@ -47,19 +46,16 @@ pub(crate) struct ScopeData {
47impl ExprScopes { 46impl ExprScopes {
48 pub(crate) fn expr_scopes_query(db: &impl HirDatabase, def: DefWithBody) -> Arc<ExprScopes> { 47 pub(crate) fn expr_scopes_query(db: &impl HirDatabase, def: DefWithBody) -> Arc<ExprScopes> {
49 let body = db.body(def); 48 let body = db.body(def);
50 let res = ExprScopes::new(body); 49 let res = ExprScopes::new(&*body);
51 Arc::new(res) 50 Arc::new(res)
52 } 51 }
53 52
54 fn new(body: Arc<Body>) -> ExprScopes { 53 fn new(body: &Body) -> ExprScopes {
55 let mut scopes = ExprScopes { 54 let mut scopes =
56 body: body.clone(), 55 ExprScopes { scopes: Arena::default(), scope_by_expr: FxHashMap::default() };
57 scopes: Arena::default(),
58 scope_by_expr: FxHashMap::default(),
59 };
60 let root = scopes.root_scope(); 56 let root = scopes.root_scope();
61 scopes.add_params_bindings(root, body.params()); 57 scopes.add_params_bindings(body, root, body.params());
62 compute_expr_scopes(body.body_expr(), &body, &mut scopes, root); 58 compute_expr_scopes(body.body_expr(), body, &mut scopes, root);
63 scopes 59 scopes
64 } 60 }
65 61
@@ -99,9 +95,8 @@ impl ExprScopes {
99 } 95 }
100 } 96 }
101 97
102 fn add_params_bindings(&mut self, scope: ScopeId, params: &[PatId]) { 98 fn add_params_bindings(&mut self, body: &Body, scope: ScopeId, params: &[PatId]) {
103 let body = Arc::clone(&self.body); 99 params.iter().for_each(|pat| self.add_bindings(body, scope, *pat));
104 params.iter().for_each(|pat| self.add_bindings(&body, scope, *pat));
105 } 100 }
106 101
107 fn set_scope(&mut self, node: ExprId, scope: ScopeId) { 102 fn set_scope(&mut self, node: ExprId, scope: ScopeId) {
@@ -151,7 +146,7 @@ fn compute_expr_scopes(expr: ExprId, body: &Body, scopes: &mut ExprScopes, scope
151 } 146 }
152 Expr::Lambda { args, body: body_expr, .. } => { 147 Expr::Lambda { args, body: body_expr, .. } => {
153 let scope = scopes.new_scope(scope); 148 let scope = scopes.new_scope(scope);
154 scopes.add_params_bindings(scope, &args); 149 scopes.add_params_bindings(body, scope, &args);
155 compute_expr_scopes(*body_expr, body, scopes, scope); 150 compute_expr_scopes(*body_expr, body, scopes, scope);
156 } 151 }
157 Expr::Match { expr, arms } => { 152 Expr::Match { expr, arms } => {