diff options
Diffstat (limited to 'crates/completion/src/context.rs')
-rw-r--r-- | crates/completion/src/context.rs | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/crates/completion/src/context.rs b/crates/completion/src/context.rs index ebf28e887..b1e8eba85 100644 --- a/crates/completion/src/context.rs +++ b/crates/completion/src/context.rs | |||
@@ -4,10 +4,8 @@ use hir::{Local, ScopeDef, Semantics, SemanticsScope, Type}; | |||
4 | use ide_db::base_db::{FilePosition, SourceDatabase}; | 4 | use ide_db::base_db::{FilePosition, SourceDatabase}; |
5 | use ide_db::{call_info::ActiveParameter, RootDatabase}; | 5 | use ide_db::{call_info::ActiveParameter, RootDatabase}; |
6 | use syntax::{ | 6 | use syntax::{ |
7 | algo::{find_covering_element, find_node_at_offset}, | 7 | algo::find_node_at_offset, ast, match_ast, AstNode, NodeOrToken, SyntaxKind::*, SyntaxNode, |
8 | ast, match_ast, AstNode, NodeOrToken, | 8 | SyntaxToken, TextRange, TextSize, |
9 | SyntaxKind::*, | ||
10 | SyntaxNode, SyntaxToken, TextRange, TextSize, | ||
11 | }; | 9 | }; |
12 | use test_utils::mark; | 10 | use test_utils::mark; |
13 | use text_edit::Indel; | 11 | use text_edit::Indel; |
@@ -92,6 +90,7 @@ pub(crate) struct CompletionContext<'a> { | |||
92 | pub(super) has_item_list_or_source_file_parent: bool, | 90 | pub(super) has_item_list_or_source_file_parent: bool, |
93 | pub(super) for_is_prev2: bool, | 91 | pub(super) for_is_prev2: bool, |
94 | pub(super) fn_is_prev: bool, | 92 | pub(super) fn_is_prev: bool, |
93 | pub(super) incomplete_let: bool, | ||
95 | pub(super) locals: Vec<(String, Local)>, | 94 | pub(super) locals: Vec<(String, Local)>, |
96 | } | 95 | } |
97 | 96 | ||
@@ -132,9 +131,9 @@ impl<'a> CompletionContext<'a> { | |||
132 | scope, | 131 | scope, |
133 | db, | 132 | db, |
134 | config, | 133 | config, |
134 | position, | ||
135 | original_token, | 135 | original_token, |
136 | token, | 136 | token, |
137 | position, | ||
138 | krate, | 137 | krate, |
139 | expected_type: None, | 138 | expected_type: None, |
140 | name_ref_syntax: None, | 139 | name_ref_syntax: None, |
@@ -155,30 +154,31 @@ impl<'a> CompletionContext<'a> { | |||
155 | is_expr: false, | 154 | is_expr: false, |
156 | is_new_item: false, | 155 | is_new_item: false, |
157 | dot_receiver: None, | 156 | dot_receiver: None, |
157 | dot_receiver_is_ambiguous_float_literal: false, | ||
158 | is_call: false, | 158 | is_call: false, |
159 | is_pattern_call: false, | 159 | is_pattern_call: false, |
160 | is_macro_call: false, | 160 | is_macro_call: false, |
161 | is_path_type: false, | 161 | is_path_type: false, |
162 | has_type_args: false, | 162 | has_type_args: false, |
163 | dot_receiver_is_ambiguous_float_literal: false, | ||
164 | attribute_under_caret: None, | 163 | attribute_under_caret: None, |
165 | mod_declaration_under_caret: None, | 164 | mod_declaration_under_caret: None, |
166 | unsafe_is_prev: false, | 165 | unsafe_is_prev: false, |
167 | in_loop_body: false, | 166 | if_is_prev: false, |
168 | ref_pat_parent: false, | ||
169 | bind_pat_parent: false, | ||
170 | block_expr_parent: false, | 167 | block_expr_parent: false, |
168 | bind_pat_parent: false, | ||
169 | ref_pat_parent: false, | ||
170 | in_loop_body: false, | ||
171 | has_trait_parent: false, | 171 | has_trait_parent: false, |
172 | has_impl_parent: false, | 172 | has_impl_parent: false, |
173 | inside_impl_trait_block: false, | 173 | inside_impl_trait_block: false, |
174 | has_field_list_parent: false, | 174 | has_field_list_parent: false, |
175 | trait_as_prev_sibling: false, | 175 | trait_as_prev_sibling: false, |
176 | impl_as_prev_sibling: false, | 176 | impl_as_prev_sibling: false, |
177 | if_is_prev: false, | ||
178 | is_match_arm: false, | 177 | is_match_arm: false, |
179 | has_item_list_or_source_file_parent: false, | 178 | has_item_list_or_source_file_parent: false, |
180 | for_is_prev2: false, | 179 | for_is_prev2: false, |
181 | fn_is_prev: false, | 180 | fn_is_prev: false, |
181 | incomplete_let: false, | ||
182 | locals, | 182 | locals, |
183 | }; | 183 | }; |
184 | 184 | ||
@@ -270,6 +270,10 @@ impl<'a> CompletionContext<'a> { | |||
270 | .filter(|module| module.item_list().is_none()); | 270 | .filter(|module| module.item_list().is_none()); |
271 | self.for_is_prev2 = for_is_prev2(syntax_element.clone()); | 271 | self.for_is_prev2 = for_is_prev2(syntax_element.clone()); |
272 | self.fn_is_prev = fn_is_prev(syntax_element.clone()); | 272 | self.fn_is_prev = fn_is_prev(syntax_element.clone()); |
273 | self.incomplete_let = | ||
274 | syntax_element.ancestors().take(6).find_map(ast::LetStmt::cast).map_or(false, |it| { | ||
275 | it.syntax().text_range().end() == syntax_element.text_range().end() | ||
276 | }); | ||
273 | } | 277 | } |
274 | 278 | ||
275 | fn fill( | 279 | fn fill( |
@@ -507,7 +511,7 @@ impl<'a> CompletionContext<'a> { | |||
507 | } | 511 | } |
508 | 512 | ||
509 | fn find_node_with_range<N: AstNode>(syntax: &SyntaxNode, range: TextRange) -> Option<N> { | 513 | fn find_node_with_range<N: AstNode>(syntax: &SyntaxNode, range: TextRange) -> Option<N> { |
510 | find_covering_element(syntax, range).ancestors().find_map(N::cast) | 514 | syntax.covering_element(range).ancestors().find_map(N::cast) |
511 | } | 515 | } |
512 | 516 | ||
513 | fn is_node<N: AstNode>(node: &SyntaxNode) -> bool { | 517 | fn is_node<N: AstNode>(node: &SyntaxNode) -> bool { |