Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/context/analysis.rs')
-rw-r--r--crates/ide-completion/src/context/analysis.rs34
1 files changed, 25 insertions, 9 deletions
diff --git a/crates/ide-completion/src/context/analysis.rs b/crates/ide-completion/src/context/analysis.rs
index 468ad81ad2..4a678963b9 100644
--- a/crates/ide-completion/src/context/analysis.rs
+++ b/crates/ide-completion/src/context/analysis.rs
@@ -562,7 +562,7 @@ fn expected_type_and_name(
}
fn classify_lifetime(
- _sema: &Semantics<'_, RootDatabase>,
+ sema: &Semantics<'_, RootDatabase>,
original_file: &SyntaxNode,
lifetime: ast::Lifetime,
) -> Option<LifetimeContext> {
@@ -571,21 +571,22 @@ fn classify_lifetime(
return None;
}
+ let lifetime =
+ find_node_at_offset::<ast::Lifetime>(original_file, lifetime.syntax().text_range().start());
let kind = match_ast! {
match parent {
- ast::LifetimeParam(param) => LifetimeKind::LifetimeParam {
- is_decl: param.lifetime().as_ref() == Some(&lifetime),
- param
- },
+ ast::LifetimeParam(_) => LifetimeKind::LifetimeParam,
ast::BreakExpr(_) => LifetimeKind::LabelRef,
ast::ContinueExpr(_) => LifetimeKind::LabelRef,
ast::Label(_) => LifetimeKind::LabelDef,
- _ => LifetimeKind::Lifetime,
+ _ => {
+ let def = lifetime.as_ref().and_then(|lt| sema.scope(lt.syntax())?.generic_def());
+ LifetimeKind::Lifetime { in_lifetime_param_bound: ast::TypeBound::can_cast(parent.kind()), def }
+ },
}
};
- let lifetime = find_node_at_offset(original_file, lifetime.syntax().text_range().start());
- Some(LifetimeContext { lifetime, kind })
+ Some(LifetimeContext { kind })
}
fn classify_name(
@@ -1129,7 +1130,22 @@ fn classify_name_ref(
let is_trailing_outer_attr = kind != AttrKind::Inner
&& non_trivia_sibling(attr.syntax().clone().into(), syntax::Direction::Next).is_none();
let annotated_item_kind = if is_trailing_outer_attr { None } else { Some(attached.kind()) };
- Some(PathKind::Attr { attr_ctx: AttrCtx { kind, annotated_item_kind } })
+ let derive_helpers = annotated_item_kind
+ .filter(|kind| {
+ matches!(
+ kind,
+ SyntaxKind::STRUCT
+ | SyntaxKind::ENUM
+ | SyntaxKind::UNION
+ | SyntaxKind::VARIANT
+ | SyntaxKind::TUPLE_FIELD
+ | SyntaxKind::RECORD_FIELD
+ )
+ })
+ .and_then(|_| nameref.as_ref()?.syntax().ancestors().find_map(ast::Adt::cast))
+ .and_then(|adt| sema.derive_helpers_in_scope(&adt))
+ .unwrap_or_default();
+ Some(PathKind::Attr { attr_ctx: AttrCtx { kind, annotated_item_kind, derive_helpers } })
};
// Infer the path kind