diff options
Diffstat (limited to 'crates/ra_hir/src')
-rw-r--r-- | crates/ra_hir/src/source_binder.rs | 29 |
1 files changed, 5 insertions, 24 deletions
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index dc9d614c0..560b48303 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs | |||
@@ -11,7 +11,7 @@ use ra_db::{FileId, FilePosition}; | |||
11 | use ra_syntax::{ | 11 | use ra_syntax::{ |
12 | SyntaxNode, AstPtr, | 12 | SyntaxNode, AstPtr, |
13 | ast::{self, AstNode, NameOwner}, | 13 | ast::{self, AstNode, NameOwner}, |
14 | algo::{find_node_at_offset, find_token_at_offset}, | 14 | algo::find_node_at_offset, |
15 | }; | 15 | }; |
16 | 16 | ||
17 | use crate::{ | 17 | use crate::{ |
@@ -196,29 +196,6 @@ 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 | ||
199 | pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> Resolver { | ||
200 | let file_id = position.file_id; | ||
201 | let file = db.parse(file_id); | ||
202 | find_token_at_offset(file.syntax(), position.offset) | ||
203 | .find_map(|token| { | ||
204 | token.parent().ancestors().find_map(|node| { | ||
205 | if ast::Expr::cast(node).is_some() || ast::Block::cast(node).is_some() { | ||
206 | if let Some(func) = function_from_child_node(db, file_id, node) { | ||
207 | let scopes = func.scopes(db); | ||
208 | let scope = scopes.scope_for_offset(position.offset); | ||
209 | Some(expr::resolver_for_scope(func.body(db), db, scope)) | ||
210 | } else { | ||
211 | // FIXME const/static/array length | ||
212 | None | ||
213 | } | ||
214 | } else { | ||
215 | try_get_resolver_for_node(db, file_id, node) | ||
216 | } | ||
217 | }) | ||
218 | }) | ||
219 | .unwrap_or_default() | ||
220 | } | ||
221 | |||
222 | fn resolver_for_node(db: &impl HirDatabase, file_id: FileId, node: &SyntaxNode) -> Resolver { | 199 | fn resolver_for_node(db: &impl HirDatabase, file_id: FileId, node: &SyntaxNode) -> Resolver { |
223 | node.ancestors() | 200 | node.ancestors() |
224 | .find_map(|node| { | 201 | .find_map(|node| { |
@@ -305,6 +282,10 @@ impl SourceAnalyzer { | |||
305 | } | 282 | } |
306 | } | 283 | } |
307 | 284 | ||
285 | pub fn resolver(&self) -> &Resolver { | ||
286 | &self.resolver | ||
287 | } | ||
288 | |||
308 | pub fn type_of(&self, _db: &impl HirDatabase, expr: &ast::Expr) -> Option<crate::Ty> { | 289 | pub fn type_of(&self, _db: &impl HirDatabase, expr: &ast::Expr) -> Option<crate::Ty> { |
309 | let expr_id = self.body_source_map.as_ref()?.node_expr(expr)?; | 290 | let expr_id = self.body_source_map.as_ref()?.node_expr(expr)?; |
310 | Some(self.infer.as_ref()?[expr_id].clone()) | 291 | Some(self.infer.as_ref()?[expr_id].clone()) |