aboutsummaryrefslogtreecommitdiff
path: root/crates/completion/src/context.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/completion/src/context.rs')
-rw-r--r--crates/completion/src/context.rs26
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};
4use ide_db::base_db::{FilePosition, SourceDatabase}; 4use ide_db::base_db::{FilePosition, SourceDatabase};
5use ide_db::{call_info::ActiveParameter, RootDatabase}; 5use ide_db::{call_info::ActiveParameter, RootDatabase};
6use syntax::{ 6use 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};
12use test_utils::mark; 10use test_utils::mark;
13use text_edit::Indel; 11use 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
509fn find_node_with_range<N: AstNode>(syntax: &SyntaxNode, range: TextRange) -> Option<N> { 513fn 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
513fn is_node<N: AstNode>(node: &SyntaxNode) -> bool { 517fn is_node<N: AstNode>(node: &SyntaxNode) -> bool {