diff options
Diffstat (limited to 'crates/ide_completion/src/context.rs')
-rw-r--r-- | crates/ide_completion/src/context.rs | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs index 4c2b31084..6cb7e5264 100644 --- a/crates/ide_completion/src/context.rs +++ b/crates/ide_completion/src/context.rs | |||
@@ -53,6 +53,7 @@ pub(crate) struct CompletionContext<'a> { | |||
53 | /// FIXME: `ActiveParameter` is string-based, which is very very wrong | 53 | /// FIXME: `ActiveParameter` is string-based, which is very very wrong |
54 | pub(super) active_parameter: Option<ActiveParameter>, | 54 | pub(super) active_parameter: Option<ActiveParameter>, |
55 | pub(super) is_param: bool, | 55 | pub(super) is_param: bool, |
56 | pub(super) is_label_ref: bool, | ||
56 | /// If a name-binding or reference to a const in a pattern. | 57 | /// If a name-binding or reference to a const in a pattern. |
57 | /// Irrefutable patterns (like let) are excluded. | 58 | /// Irrefutable patterns (like let) are excluded. |
58 | pub(super) is_pat_binding_or_const: bool, | 59 | pub(super) is_pat_binding_or_const: bool, |
@@ -155,6 +156,7 @@ impl<'a> CompletionContext<'a> { | |||
155 | record_field_syntax: None, | 156 | record_field_syntax: None, |
156 | impl_def: None, | 157 | impl_def: None, |
157 | active_parameter: ActiveParameter::at(db, position), | 158 | active_parameter: ActiveParameter::at(db, position), |
159 | is_label_ref: false, | ||
158 | is_param: false, | 160 | is_param: false, |
159 | is_pat_binding_or_const: false, | 161 | is_pat_binding_or_const: false, |
160 | is_irrefutable_pat_binding: false, | 162 | is_irrefutable_pat_binding: false, |
@@ -468,12 +470,26 @@ impl<'a> CompletionContext<'a> { | |||
468 | ) { | 470 | ) { |
469 | self.lifetime_syntax = | 471 | self.lifetime_syntax = |
470 | find_node_at_offset(original_file, lifetime.syntax().text_range().start()); | 472 | find_node_at_offset(original_file, lifetime.syntax().text_range().start()); |
471 | if lifetime.syntax().parent().map_or(false, |p| p.kind() != syntax::SyntaxKind::ERROR) { | 473 | if let Some(parent) = lifetime.syntax().parent() { |
472 | self.lifetime_allowed = true; | 474 | if parent.kind() == syntax::SyntaxKind::ERROR { |
473 | } | 475 | return; |
474 | if let Some(_) = lifetime.syntax().parent().and_then(ast::LifetimeParam::cast) { | 476 | } |
475 | self.lifetime_param_syntax = | 477 | |
476 | self.sema.find_node_at_offset_with_macros(original_file, offset); | 478 | if parent.kind() != syntax::SyntaxKind::LABEL { |
479 | match_ast! { | ||
480 | match parent { | ||
481 | ast::LifetimeParam(_it) => { | ||
482 | self.lifetime_allowed = true; | ||
483 | self.lifetime_param_syntax = | ||
484 | self.sema.find_node_at_offset_with_macros(original_file, offset); | ||
485 | }, | ||
486 | ast::BreakExpr(_it) => self.is_label_ref = true, | ||
487 | ast::ContinueExpr(_it) => self.is_label_ref = true, | ||
488 | ast::Label(_it) => (), | ||
489 | _ => self.lifetime_allowed = true, | ||
490 | } | ||
491 | } | ||
492 | } | ||
477 | } | 493 | } |
478 | } | 494 | } |
479 | 495 | ||