diff options
-rw-r--r-- | crates/ra_analysis/src/hir/function/mod.rs | 25 | ||||
-rw-r--r-- | crates/ra_analysis/src/hir/mod.rs | 9 | ||||
-rw-r--r-- | crates/ra_analysis/src/imp.rs | 11 |
3 files changed, 36 insertions, 9 deletions
diff --git a/crates/ra_analysis/src/hir/function/mod.rs b/crates/ra_analysis/src/hir/function/mod.rs index 86eee5e93..c8af6bc21 100644 --- a/crates/ra_analysis/src/hir/function/mod.rs +++ b/crates/ra_analysis/src/hir/function/mod.rs | |||
@@ -1,7 +1,10 @@ | |||
1 | pub(super) mod imp; | 1 | pub(super) mod imp; |
2 | mod scope; | 2 | mod scope; |
3 | 3 | ||
4 | use std::cmp::{max, min}; | 4 | use std::{ |
5 | cmp::{max, min}, | ||
6 | sync::Arc, | ||
7 | }; | ||
5 | 8 | ||
6 | use ra_syntax::{ | 9 | use ra_syntax::{ |
7 | ast::{self, AstNode, DocCommentsOwner, NameOwner}, | 10 | ast::{self, AstNode, DocCommentsOwner, NameOwner}, |
@@ -9,6 +12,7 @@ use ra_syntax::{ | |||
9 | }; | 12 | }; |
10 | 13 | ||
11 | use crate::{ | 14 | use crate::{ |
15 | hir::HirDatabase, | ||
12 | syntax_ptr::SyntaxPtr, FileId, | 16 | syntax_ptr::SyntaxPtr, FileId, |
13 | loc2id::IdDatabase, | 17 | loc2id::IdDatabase, |
14 | }; | 18 | }; |
@@ -23,6 +27,25 @@ impl FnId { | |||
23 | } | 27 | } |
24 | } | 28 | } |
25 | 29 | ||
30 | pub(crate) struct FunctionDescriptor { | ||
31 | fn_id: FnId, | ||
32 | } | ||
33 | |||
34 | impl FunctionDescriptor { | ||
35 | pub(crate) fn guess_from_source( | ||
36 | db: &impl HirDatabase, | ||
37 | file_id: FileId, | ||
38 | fn_def: ast::FnDef, | ||
39 | ) -> FunctionDescriptor { | ||
40 | let fn_id = FnId::get(db, file_id, fn_def); | ||
41 | FunctionDescriptor { fn_id } | ||
42 | } | ||
43 | |||
44 | pub(crate) fn scope(&self, db: &impl HirDatabase) -> Arc<FnScopes> { | ||
45 | db.fn_scopes(self.fn_id) | ||
46 | } | ||
47 | } | ||
48 | |||
26 | #[derive(Debug, Clone)] | 49 | #[derive(Debug, Clone)] |
27 | pub struct FnDescriptor { | 50 | pub struct FnDescriptor { |
28 | pub name: String, | 51 | pub name: String, |
diff --git a/crates/ra_analysis/src/hir/mod.rs b/crates/ra_analysis/src/hir/mod.rs index 232a8558b..edeaeb8e6 100644 --- a/crates/ra_analysis/src/hir/mod.rs +++ b/crates/ra_analysis/src/hir/mod.rs | |||
@@ -21,7 +21,7 @@ use crate::{ | |||
21 | db::SyntaxDatabase, | 21 | db::SyntaxDatabase, |
22 | hir::function::{resolve_local_name, FnId, FnScopes}, | 22 | hir::function::{resolve_local_name, FnId, FnScopes}, |
23 | hir::module::{ | 23 | hir::module::{ |
24 | ModuleId, ModuleTree, ModuleSource, ModuleDescriptor, | 24 | ModuleId, ModuleTree, ModuleSource, |
25 | nameres::{ItemMap, InputModuleItems, FileItems} | 25 | nameres::{ItemMap, InputModuleItems, FileItems} |
26 | }, | 26 | }, |
27 | input::SourceRootId, | 27 | input::SourceRootId, |
@@ -30,8 +30,11 @@ use crate::{ | |||
30 | Cancelable, | 30 | Cancelable, |
31 | }; | 31 | }; |
32 | 32 | ||
33 | pub(crate) use self::path::{Path, PathKind}; | 33 | pub(crate) use self::{ |
34 | pub(crate) use self::module::nameres::FileItemId; | 34 | path::{Path, PathKind}, |
35 | module::{ModuleDescriptor, nameres::FileItemId}, | ||
36 | function::FunctionDescriptor, | ||
37 | }; | ||
35 | 38 | ||
36 | salsa::query_group! { | 39 | salsa::query_group! { |
37 | pub(crate) trait HirDatabase: SyntaxDatabase + IdDatabase { | 40 | pub(crate) trait HirDatabase: SyntaxDatabase + IdDatabase { |
diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index 6dadc059f..ad4b40c58 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs | |||
@@ -20,9 +20,10 @@ use crate::{ | |||
20 | completion::{completions, CompletionItem}, | 20 | completion::{completions, CompletionItem}, |
21 | db::{self, FileSyntaxQuery, SyntaxDatabase}, | 21 | db::{self, FileSyntaxQuery, SyntaxDatabase}, |
22 | hir::{ | 22 | hir::{ |
23 | function::{FnDescriptor, FnId}, | 23 | FunctionDescriptor, ModuleDescriptor, |
24 | module::{ModuleDescriptor, Problem}, | 24 | function::FnDescriptor, |
25 | DeclarationDescriptor, HirDatabase, | 25 | module::{Problem}, |
26 | DeclarationDescriptor, | ||
26 | }, | 27 | }, |
27 | input::{FilesDatabase, SourceRoot, SourceRootId, WORKSPACE}, | 28 | input::{FilesDatabase, SourceRoot, SourceRootId, WORKSPACE}, |
28 | symbol_index::SymbolIndex, | 29 | symbol_index::SymbolIndex, |
@@ -587,8 +588,8 @@ fn resolve_local_name( | |||
587 | name_ref: ast::NameRef, | 588 | name_ref: ast::NameRef, |
588 | ) -> Option<(SmolStr, TextRange)> { | 589 | ) -> Option<(SmolStr, TextRange)> { |
589 | let fn_def = name_ref.syntax().ancestors().find_map(ast::FnDef::cast)?; | 590 | let fn_def = name_ref.syntax().ancestors().find_map(ast::FnDef::cast)?; |
590 | let fn_id = FnId::get(db, file_id, fn_def); | 591 | let function = FunctionDescriptor::guess_from_source(db, file_id, fn_def); |
591 | let scopes = db.fn_scopes(fn_id); | 592 | let scopes = function.scope(db); |
592 | let scope_entry = crate::hir::function::resolve_local_name(name_ref, &scopes)?; | 593 | let scope_entry = crate::hir::function::resolve_local_name(name_ref, &scopes)?; |
593 | let syntax = db.resolve_syntax_ptr(scope_entry.ptr().into_global(file_id)); | 594 | let syntax = db.resolve_syntax_ptr(scope_entry.ptr().into_global(file_id)); |
594 | Some((scope_entry.name().clone(), syntax.range())) | 595 | Some((scope_entry.name().clone(), syntax.range())) |