diff options
Diffstat (limited to 'crates/ra_hir/src/expr.rs')
-rw-r--r-- | crates/ra_hir/src/expr.rs | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs index 503a09f25..6c294bf10 100644 --- a/crates/ra_hir/src/expr.rs +++ b/crates/ra_hir/src/expr.rs | |||
@@ -72,11 +72,23 @@ impl Body { | |||
72 | } | 72 | } |
73 | 73 | ||
74 | // needs arbitrary_self_types to be a method... or maybe move to the def? | 74 | // needs arbitrary_self_types to be a method... or maybe move to the def? |
75 | #[allow(dead_code)] | 75 | pub fn resolver_for_expr( |
76 | pub fn resolver_for_expr(body: Arc<Body>, db: &impl HirDatabase, expr_id: ExprId) -> Resolver { | 76 | body: Arc<Body>, |
77 | db: &impl HirDatabase, | ||
78 | expr_id: ExprId, | ||
79 | ) -> Resolver<'static> { | ||
80 | let scopes = db.expr_scopes(body.owner); | ||
81 | resolver_for_scope(body, db, scopes.scope_for(expr_id)) | ||
82 | } | ||
83 | |||
84 | pub fn resolver_for_scope( | ||
85 | body: Arc<Body>, | ||
86 | db: &impl HirDatabase, | ||
87 | scope_id: Option<scope::ScopeId>, | ||
88 | ) -> Resolver<'static> { | ||
77 | let mut r = body.owner.resolver(db); | 89 | let mut r = body.owner.resolver(db); |
78 | let scopes = db.expr_scopes(body.owner); | 90 | let scopes = db.expr_scopes(body.owner); |
79 | let scope_chain = scopes.scope_chain_for(expr_id).collect::<Vec<_>>(); | 91 | let scope_chain = scopes.scope_chain_for(scope_id).collect::<Vec<_>>(); |
80 | for scope in scope_chain.into_iter().rev() { | 92 | for scope in scope_chain.into_iter().rev() { |
81 | r = r.push_expr_scope(Arc::clone(&scopes), scope); | 93 | r = r.push_expr_scope(Arc::clone(&scopes), scope); |
82 | } | 94 | } |