From 49e746b010bbba408e9e4b1a40d89642e4cb84c6 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 22 Dec 2018 11:01:03 +0300 Subject: completion uses hir scopes --- .../ra_analysis/src/completion/complete_scope.rs | 44 +++++++++++----------- crates/ra_analysis/src/imp.rs | 6 +-- crates/ra_hir/src/function.rs | 2 +- crates/ra_hir/src/function/scope.rs | 2 +- crates/ra_hir/src/source_binder.rs | 12 +++++- 5 files changed, 39 insertions(+), 27 deletions(-) diff --git a/crates/ra_analysis/src/completion/complete_scope.rs b/crates/ra_analysis/src/completion/complete_scope.rs index 82610d63f..a57670e3b 100644 --- a/crates/ra_analysis/src/completion/complete_scope.rs +++ b/crates/ra_analysis/src/completion/complete_scope.rs @@ -10,32 +10,34 @@ pub(super) fn complete_scope(acc: &mut Completions, ctx: &CompletionContext) -> if !ctx.is_trivial_path { return Ok(()); } + let module = match &ctx.module { + Some(it) => it, + None => return Ok(()), + }; if let Some(fn_def) = ctx.enclosing_fn { - let scopes = hir::FnScopes::new(fn_def); + let function = hir::source_binder::function_from_module(ctx.db, module, fn_def); + let scopes = function.scopes(ctx.db); complete_fn(acc, &scopes, ctx.offset); } - if let Some(module) = &ctx.module { - let module_scope = module.scope(ctx.db)?; - module_scope - .entries() - .filter(|(_name, res)| { - // Don't expose this item - match res.import { - None => true, - Some(import) => { - let range = import.range(ctx.db, module.source().file_id()); - !range.is_subrange(&ctx.leaf.range()) - } + let module_scope = module.scope(ctx.db)?; + module_scope + .entries() + .filter(|(_name, res)| { + // Don't expose this item + match res.import { + None => true, + Some(import) => { + let range = import.range(ctx.db, module.source().file_id()); + !range.is_subrange(&ctx.leaf.range()) } - }) - .for_each(|(name, res)| { - CompletionItem::new(CompletionKind::Reference, name.to_string()) - .from_resolution(ctx.db, res) - .add_to(acc) - }); - } - + } + }) + .for_each(|(name, res)| { + CompletionItem::new(CompletionKind::Reference, name.to_string()) + .from_resolution(ctx.db, res) + .add_to(acc) + }); Ok(()) } diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index 340f7c78c..b01382808 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs @@ -235,7 +235,7 @@ impl AnalysisImpl { position.file_id, name_ref.syntax(), )? { - let scope = fn_descr.scope(&*self.db); + let scope = fn_descr.scopes(&*self.db); // First try to resolve the symbol locally if let Some(entry) = scope.resolve_local_name(name_ref) { rr.add_resolution( @@ -294,7 +294,7 @@ impl AnalysisImpl { let mut ret = vec![(position.file_id, binding.syntax().range())]; ret.extend( descr - .scope(&*self.db) + .scopes(&*self.db) .find_all_refs(binding) .into_iter() .map(|ref_desc| (position.file_id, ref_desc.range)), @@ -322,7 +322,7 @@ impl AnalysisImpl { position.file_id, name_ref.syntax(), )?); - let scope = descr.scope(db); + let scope = descr.scopes(db); let resolved = ctry!(scope.resolve_local_name(name_ref)); let resolved = resolved.ptr().resolve(source_file); let binding = ctry!(find_node_at_offset::( diff --git a/crates/ra_hir/src/function.rs b/crates/ra_hir/src/function.rs index 5187dc051..2925beb16 100644 --- a/crates/ra_hir/src/function.rs +++ b/crates/ra_hir/src/function.rs @@ -27,7 +27,7 @@ impl Function { Function { fn_id } } - pub fn scope(&self, db: &impl HirDatabase) -> Arc { + pub fn scopes(&self, db: &impl HirDatabase) -> Arc { db.fn_scopes(self.fn_id) } diff --git a/crates/ra_hir/src/function/scope.rs b/crates/ra_hir/src/function/scope.rs index 77be25f1a..a1a580979 100644 --- a/crates/ra_hir/src/function/scope.rs +++ b/crates/ra_hir/src/function/scope.rs @@ -33,7 +33,7 @@ pub struct ScopeData { } impl FnScopes { - pub fn new(fn_def: ast::FnDef) -> FnScopes { + pub(crate) fn new(fn_def: ast::FnDef) -> FnScopes { let mut scopes = FnScopes { self_param: fn_def .param_list() diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index ce2a0f2e8..a0165aef2 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -74,6 +74,16 @@ pub fn function_from_source( fn_def: ast::FnDef, ) -> Cancelable> { let module = ctry!(module_from_child_node(db, file_id, fn_def.syntax())?); + let res = function_from_module(db, &module, fn_def); + Ok(Some(res)) +} + +pub fn function_from_module( + db: &impl HirDatabase, + module: &Module, + fn_def: ast::FnDef, +) -> Function { + let file_id = module.source().file_id(); let file_items = db.file_items(file_id); let item_id = file_items.id_of(file_id, fn_def.syntax()); let source_item_id = SourceItemId { @@ -86,7 +96,7 @@ pub fn function_from_source( module_id: module.module_id, source_item_id, }; - Ok(Some(Function::new(def_loc.id(db)))) + Function::new(def_loc.id(db)) } pub fn function_from_child_node( -- cgit v1.2.3