diff options
Diffstat (limited to 'crates/ide_completion/src/context.rs')
-rw-r--r-- | crates/ide_completion/src/context.rs | 21 |
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 | }) |