aboutsummaryrefslogtreecommitdiff
path: root/crates/ide_completion/src/context.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide_completion/src/context.rs')
-rw-r--r--crates/ide_completion/src/context.rs21
1 files changed, 12 insertions, 9 deletions
diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs
index e6cc6329c..6d57da06a 100644
--- a/crates/ide_completion/src/context.rs
+++ b/crates/ide_completion/src/context.rs
@@ -120,7 +120,7 @@ impl<'a> CompletionContext<'a> {
120 let original_token = 120 let original_token =
121 original_file.syntax().token_at_offset(position.offset).left_biased()?; 121 original_file.syntax().token_at_offset(position.offset).left_biased()?;
122 let token = sema.descend_into_macros(original_token.clone()); 122 let token = sema.descend_into_macros(original_token.clone());
123 let scope = sema.scope_at_offset(&token.parent(), position.offset); 123 let scope = sema.scope_at_offset(&token, position.offset);
124 let mut locals = vec![]; 124 let mut locals = vec![];
125 scope.process_all_names(&mut |name, scope| { 125 scope.process_all_names(&mut |name, scope| {
126 if let ScopeDef::Local(local) = scope { 126 if let ScopeDef::Local(local) = scope {
@@ -281,7 +281,7 @@ impl<'a> CompletionContext<'a> {
281 fn fill_impl_def(&mut self) { 281 fn fill_impl_def(&mut self) {
282 self.impl_def = self 282 self.impl_def = self
283 .sema 283 .sema
284 .ancestors_with_macros(self.token.parent()) 284 .token_ancestors_with_macros(self.token.clone())
285 .take_while(|it| it.kind() != SOURCE_FILE && it.kind() != MODULE) 285 .take_while(|it| it.kind() != SOURCE_FILE && it.kind() != MODULE)
286 .find_map(ast::Impl::cast); 286 .find_map(ast::Impl::cast);
287 } 287 }
@@ -293,7 +293,10 @@ impl<'a> CompletionContext<'a> {
293 offset: TextSize, 293 offset: TextSize,
294 ) { 294 ) {
295 let expected = { 295 let expected = {
296 let mut node = self.token.parent(); 296 let mut node = match self.token.parent() {
297 Some(it) => it,
298 None => return,
299 };
297 loop { 300 loop {
298 let ret = match_ast! { 301 let ret = match_ast! {
299 match node { 302 match node {
@@ -310,7 +313,7 @@ impl<'a> CompletionContext<'a> {
310 313
311 (ty, name) 314 (ty, name)
312 }, 315 },
313 ast::ArgList(it) => { 316 ast::ArgList(_it) => {
314 cov_mark::hit!(expected_type_fn_param_with_leading_char); 317 cov_mark::hit!(expected_type_fn_param_with_leading_char);
315 cov_mark::hit!(expected_type_fn_param_without_leading_char); 318 cov_mark::hit!(expected_type_fn_param_without_leading_char);
316 ActiveParameter::at_token( 319 ActiveParameter::at_token(
@@ -319,7 +322,7 @@ impl<'a> CompletionContext<'a> {
319 ).map(|ap| (Some(ap.ty), Some(ap.name))) 322 ).map(|ap| (Some(ap.ty), Some(ap.name)))
320 .unwrap_or((None, None)) 323 .unwrap_or((None, None))
321 }, 324 },
322 ast::RecordExprFieldList(it) => { 325 ast::RecordExprFieldList(_it) => {
323 cov_mark::hit!(expected_type_struct_field_without_leading_char); 326 cov_mark::hit!(expected_type_struct_field_without_leading_char);
324 self.token.prev_sibling_or_token() 327 self.token.prev_sibling_or_token()
325 .and_then(|se| se.into_node()) 328 .and_then(|se| se.into_node())
@@ -355,7 +358,7 @@ impl<'a> CompletionContext<'a> {
355 358
356 (ty, None) 359 (ty, None)
357 }, 360 },
358 ast::Fn(it) => { 361 ast::Fn(_it) => {
359 cov_mark::hit!(expected_type_fn_ret_with_leading_char); 362 cov_mark::hit!(expected_type_fn_ret_with_leading_char);
360 cov_mark::hit!(expected_type_fn_ret_without_leading_char); 363 cov_mark::hit!(expected_type_fn_ret_without_leading_char);
361 let ty = self.token.ancestors() 364 let ty = self.token.ancestors()
@@ -474,17 +477,17 @@ impl<'a> CompletionContext<'a> {
474 } 477 }
475 478
476 self.use_item_syntax = 479 self.use_item_syntax =
477 self.sema.ancestors_with_macros(self.token.parent()).find_map(ast::Use::cast); 480 self.sema.token_ancestors_with_macros(self.token.clone()).find_map(ast::Use::cast);
478 481
479 self.function_syntax = self 482 self.function_syntax = self
480 .sema 483 .sema
481 .ancestors_with_macros(self.token.parent()) 484 .token_ancestors_with_macros(self.token.clone())
482 .take_while(|it| it.kind() != SOURCE_FILE && it.kind() != MODULE) 485 .take_while(|it| it.kind() != SOURCE_FILE && it.kind() != MODULE)
483 .find_map(ast::Fn::cast); 486 .find_map(ast::Fn::cast);
484 487
485 self.record_field_syntax = self 488 self.record_field_syntax = self
486 .sema 489 .sema
487 .ancestors_with_macros(self.token.parent()) 490 .token_ancestors_with_macros(self.token.clone())
488 .take_while(|it| { 491 .take_while(|it| {
489 it.kind() != SOURCE_FILE && it.kind() != MODULE && it.kind() != CALL_EXPR 492 it.kind() != SOURCE_FILE && it.kind() != MODULE && it.kind() != CALL_EXPR
490 }) 493 })