diff options
Diffstat (limited to 'crates/ra_ide_api/src/completion/complete_scope.rs')
-rw-r--r-- | crates/ra_ide_api/src/completion/complete_scope.rs | 63 |
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 @@ | |||
1 | use rustc_hash::FxHashSet; | 1 | use crate::completion::{CompletionItem, Completions, CompletionKind, CompletionContext}; |
2 | use ra_syntax::ast::AstNode; | ||
3 | use crate::completion::{CompletionItem, CompletionItemKind, Completions, CompletionKind, CompletionContext}; | ||
4 | 2 | ||
5 | pub(super) fn complete_scope(acc: &mut Completions, ctx: &CompletionContext) { | 3 | pub(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 | |||
42 | fn 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 | } |