diff options
Diffstat (limited to 'crates/ide/src/completion/completion_context.rs')
-rw-r--r-- | crates/ide/src/completion/completion_context.rs | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/crates/ide/src/completion/completion_context.rs b/crates/ide/src/completion/completion_context.rs index 47355d5dc..3ef1b97cf 100644 --- a/crates/ide/src/completion/completion_context.rs +++ b/crates/ide/src/completion/completion_context.rs | |||
@@ -1,7 +1,7 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use base_db::SourceDatabase; | 3 | use base_db::SourceDatabase; |
4 | use hir::{Semantics, SemanticsScope, Type}; | 4 | use hir::{Local, ScopeDef, Semantics, SemanticsScope, Type}; |
5 | use ide_db::RootDatabase; | 5 | use ide_db::RootDatabase; |
6 | use syntax::{ | 6 | use syntax::{ |
7 | algo::{find_covering_element, find_node_at_offset}, | 7 | algo::{find_covering_element, find_node_at_offset}, |
@@ -90,6 +90,7 @@ pub(crate) struct CompletionContext<'a> { | |||
90 | pub(super) impl_as_prev_sibling: bool, | 90 | pub(super) impl_as_prev_sibling: bool, |
91 | pub(super) is_match_arm: bool, | 91 | pub(super) is_match_arm: bool, |
92 | pub(super) has_item_list_or_source_file_parent: bool, | 92 | pub(super) has_item_list_or_source_file_parent: bool, |
93 | pub(super) locals: Vec<(String, Local)>, | ||
93 | } | 94 | } |
94 | 95 | ||
95 | impl<'a> CompletionContext<'a> { | 96 | impl<'a> CompletionContext<'a> { |
@@ -118,6 +119,12 @@ impl<'a> CompletionContext<'a> { | |||
118 | original_file.syntax().token_at_offset(position.offset).left_biased()?; | 119 | original_file.syntax().token_at_offset(position.offset).left_biased()?; |
119 | let token = sema.descend_into_macros(original_token.clone()); | 120 | let token = sema.descend_into_macros(original_token.clone()); |
120 | let scope = sema.scope_at_offset(&token.parent(), position.offset); | 121 | let scope = sema.scope_at_offset(&token.parent(), position.offset); |
122 | let mut locals = vec![]; | ||
123 | scope.process_all_names(&mut |name, scope| { | ||
124 | if let ScopeDef::Local(local) = scope { | ||
125 | locals.push((name.to_string(), local)); | ||
126 | } | ||
127 | }); | ||
121 | let mut ctx = CompletionContext { | 128 | let mut ctx = CompletionContext { |
122 | sema, | 129 | sema, |
123 | scope, | 130 | scope, |
@@ -165,6 +172,7 @@ impl<'a> CompletionContext<'a> { | |||
165 | if_is_prev: false, | 172 | if_is_prev: false, |
166 | is_match_arm: false, | 173 | is_match_arm: false, |
167 | has_item_list_or_source_file_parent: false, | 174 | has_item_list_or_source_file_parent: false, |
175 | locals, | ||
168 | }; | 176 | }; |
169 | 177 | ||
170 | let mut original_file = original_file.syntax().clone(); | 178 | let mut original_file = original_file.syntax().clone(); |