aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/source_binder.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/source_binder.rs')
-rw-r--r--crates/ra_hir/src/source_binder.rs24
1 files changed, 18 insertions, 6 deletions
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs
index 182bc36ff..846394212 100644
--- a/crates/ra_hir/src/source_binder.rs
+++ b/crates/ra_hir/src/source_binder.rs
@@ -9,7 +9,7 @@ use std::sync::Arc;
9 9
10use ra_db::{FileId, FilePosition}; 10use ra_db::{FileId, FilePosition};
11use ra_syntax::{ 11use ra_syntax::{
12 SyntaxNode, AstPtr, 12 SyntaxNode, AstPtr, TextUnit,
13 ast::{self, AstNode, NameOwner}, 13 ast::{self, AstNode, NameOwner},
14 algo::find_node_at_offset, 14 algo::find_node_at_offset,
15}; 15};
@@ -196,13 +196,21 @@ pub fn trait_from_module(
196 Trait { id: ctx.to_def(trait_def) } 196 Trait { id: ctx.to_def(trait_def) }
197} 197}
198 198
199fn resolver_for_node(db: &impl HirDatabase, file_id: FileId, node: &SyntaxNode) -> Resolver { 199fn resolver_for_node(
200 db: &impl HirDatabase,
201 file_id: FileId,
202 node: &SyntaxNode,
203 offset: Option<TextUnit>,
204) -> Resolver {
200 node.ancestors() 205 node.ancestors()
201 .find_map(|node| { 206 .find_map(|node| {
202 if ast::Expr::cast(node).is_some() || ast::Block::cast(node).is_some() { 207 if ast::Expr::cast(node).is_some() || ast::Block::cast(node).is_some() {
203 if let Some(func) = function_from_child_node(db, file_id, node) { 208 if let Some(func) = function_from_child_node(db, file_id, node) {
204 let scopes = func.scopes(db); 209 let scopes = func.scopes(db);
205 let scope = scopes.scope_for(&node); 210 let scope = match offset {
211 None => scopes.scope_for(&node),
212 Some(offset) => scopes.scope_for_offset(offset),
213 };
206 Some(expr::resolver_for_scope(func.body(db), db, scope)) 214 Some(expr::resolver_for_scope(func.body(db), db, scope))
207 } else { 215 } else {
208 // FIXME const/static/array length 216 // FIXME const/static/array length
@@ -260,7 +268,12 @@ pub enum PathResolution {
260} 268}
261 269
262impl SourceAnalyzer { 270impl SourceAnalyzer {
263 pub fn new(db: &impl HirDatabase, file_id: FileId, node: &SyntaxNode) -> SourceAnalyzer { 271 pub fn new(
272 db: &impl HirDatabase,
273 file_id: FileId,
274 node: &SyntaxNode,
275 offset: Option<TextUnit>,
276 ) -> SourceAnalyzer {
264 let def_with_body = node.ancestors().find_map(|node| { 277 let def_with_body = node.ancestors().find_map(|node| {
265 if let Some(src) = ast::FnDef::cast(node) { 278 if let Some(src) = ast::FnDef::cast(node) {
266 return function_from_source(db, file_id, src).map(DefWithBody::from); 279 return function_from_source(db, file_id, src).map(DefWithBody::from);
@@ -274,8 +287,7 @@ impl SourceAnalyzer {
274 None 287 None
275 }); 288 });
276 SourceAnalyzer { 289 SourceAnalyzer {
277 //TODO: use scope_for_offset here to get correct scope for completion 290 resolver: resolver_for_node(db, file_id, node, offset),
278 resolver: resolver_for_node(db, file_id, node),
279 body_source_map: def_with_body.map(|it| it.body_source_map(db)), 291 body_source_map: def_with_body.map(|it| it.body_source_map(db)),
280 infer: def_with_body.map(|it| it.infer(db)), 292 infer: def_with_body.map(|it| it.infer(db)),
281 } 293 }