aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/completion/complete_scope.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api/src/completion/complete_scope.rs')
-rw-r--r--crates/ra_ide_api/src/completion/complete_scope.rs63
1 files changed, 17 insertions, 46 deletions
diff --git a/crates/ra_ide_api/src/completion/complete_scope.rs b/crates/ra_ide_api/src/completion/complete_scope.rs
index f837bb1db..3488d6480 100644
--- a/crates/ra_ide_api/src/completion/complete_scope.rs
+++ b/crates/ra_ide_api/src/completion/complete_scope.rs
@@ -1,61 +1,32 @@
1use rustc_hash::FxHashSet; 1use crate::completion::{CompletionItem, Completions, CompletionKind, CompletionContext};
2use ra_syntax::ast::AstNode;
3use crate::completion::{CompletionItem, CompletionItemKind, Completions, CompletionKind, CompletionContext};
4 2
5pub(super) fn complete_scope(acc: &mut Completions, ctx: &CompletionContext) { 3pub(super) fn complete_scope(acc: &mut Completions, ctx: &CompletionContext) {
6 if !ctx.is_trivial_path { 4 if !ctx.is_trivial_path {
7 return; 5 return;
8 } 6 }
9 let module = match &ctx.module { 7 let names = ctx.resolver.all_names();
10 Some(it) => it,
11 None => return,
12 };
13 if let Some(function) = &ctx.function {
14 let scopes = function.scopes(ctx.db);
15 complete_fn(acc, &scopes, ctx);
16 }
17 8
18 let module_scope = module.scope(ctx.db); 9 // let module_scope = module.scope(ctx.db);
19 module_scope 10 names
20 .entries() 11 .into_iter()
21 .filter(|(_name, res)| { 12 // FIXME check tests
22 // For cases like `use self::foo<|>` don't suggest foo itself. 13 // .filter(|(_name, res)| {
23 match res.import { 14 // // For cases like `use self::foo<|>` don't suggest foo itself.
24 None => true, 15 // match res.import {
25 Some(import) => { 16 // None => true,
26 let source = module.import_source(ctx.db, import); 17 // Some(import) => {
27 !source.syntax().range().is_subrange(&ctx.leaf.range()) 18 // let source = module.import_source(ctx.db, import);
28 } 19 // !source.syntax().range().is_subrange(&ctx.leaf.range())
29 } 20 // }
30 }) 21 // }
22 // })
31 .for_each(|(name, res)| { 23 .for_each(|(name, res)| {
32 CompletionItem::new( 24 CompletionItem::new(
33 CompletionKind::Reference, 25 CompletionKind::Reference,
34 ctx.source_range(), 26 ctx.source_range(),
35 name.to_string(), 27 name.to_string(),
36 ) 28 )
37 .from_resolution(ctx, res) 29 .from_resolution(ctx, &res)
38 .add_to(acc)
39 });
40}
41
42fn complete_fn(
43 acc: &mut Completions,
44 scopes: &hir::ScopesWithSyntaxMapping,
45 ctx: &CompletionContext,
46) {
47 let mut shadowed = FxHashSet::default();
48 scopes
49 .scope_chain_for_offset(ctx.offset)
50 .flat_map(|scope| scopes.scopes.entries(scope).iter())
51 .filter(|entry| shadowed.insert(entry.name()))
52 .for_each(|entry| {
53 CompletionItem::new(
54 CompletionKind::Reference,
55 ctx.source_range(),
56 entry.name().to_string(),
57 )
58 .kind(CompletionItemKind::Binding)
59 .add_to(acc) 30 .add_to(acc)
60 }); 31 });
61} 32}