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.rs44
1 files changed, 22 insertions, 22 deletions
diff --git a/crates/ide-completion/src/context/analysis.rs b/crates/ide-completion/src/context/analysis.rs
index 8d38677df6..25b384d323 100644
--- a/crates/ide-completion/src/context/analysis.rs
+++ b/crates/ide-completion/src/context/analysis.rs
@@ -13,8 +13,8 @@ use syntax::{
use crate::context::{
CompletionContext, DotAccess, DotAccessKind, IdentContext, ItemListKind, LifetimeContext,
LifetimeKind, NameContext, NameKind, NameRefContext, NameRefKind, ParamKind, PathCompletionCtx,
- PathKind, PathQualifierCtx, PatternContext, PatternRefutability, Qualified, QualifierCtx,
- TypeAscriptionTarget, TypeLocation, COMPLETION_MARKER,
+ PathKind, PatternContext, PatternRefutability, Qualified, QualifierCtx, TypeAscriptionTarget,
+ TypeLocation, COMPLETION_MARKER,
};
impl<'a> CompletionContext<'a> {
@@ -339,14 +339,6 @@ impl<'a> CompletionContext<'a> {
// Overwrite the path kind for derives
if let Some((original_file, file_with_fake_ident, offset, origin_attr)) = derive_ctx {
- self.existing_derives = self
- .sema
- .resolve_derive_macro(&origin_attr)
- .into_iter()
- .flatten()
- .flatten()
- .collect();
-
if let Some(ast::NameLike::NameRef(name_ref)) =
find_node_at_offset(&file_with_fake_ident, offset)
{
@@ -354,7 +346,15 @@ impl<'a> CompletionContext<'a> {
let (mut nameref_ctx, _, _) =
Self::classify_name_ref(&self.sema, &original_file, name_ref, parent);
if let Some(NameRefKind::Path(path_ctx)) = &mut nameref_ctx.kind {
- path_ctx.kind = PathKind::Derive;
+ path_ctx.kind = PathKind::Derive {
+ existing_derives: self
+ .sema
+ .resolve_derive_macro(&origin_attr)
+ .into_iter()
+ .flatten()
+ .flatten()
+ .collect(),
+ };
}
self.ident_ctx = IdentContext::NameRef(nameref_ctx);
return Some(());
@@ -589,6 +589,7 @@ impl<'a> CompletionContext<'a> {
parent: path.parent_path(),
kind: PathKind::Item { kind: ItemListKind::SourceFile },
has_type_args: false,
+ use_tree_parent: false,
};
let is_in_block = |it: &SyntaxNode| {
@@ -853,6 +854,7 @@ impl<'a> CompletionContext<'a> {
// calculate the qualifier context
if let Some((path, use_tree_parent)) = path_or_use_tree_qualifier(&path) {
+ path_ctx.use_tree_parent = use_tree_parent;
if !use_tree_parent && segment.coloncolon_token().is_some() {
path_ctx.qualified = Qualified::Absolute;
} else {
@@ -861,10 +863,6 @@ impl<'a> CompletionContext<'a> {
.and_then(|it| find_node_in_file(original_file, &it))
.map(|it| it.parent_path());
if let Some(path) = path {
- let res = sema.resolve_path(&path);
- let is_super_chain = iter::successors(Some(path.clone()), |p| p.qualifier())
- .all(|p| p.segment().and_then(|s| s.super_token()).is_some());
-
// `<_>::$0`
let is_infer_qualifier = path.qualifier().is_none()
&& matches!(
@@ -875,13 +873,15 @@ impl<'a> CompletionContext<'a> {
})
);
- path_ctx.qualified = Qualified::With(PathQualifierCtx {
- path,
- resolution: res,
- is_super_chain,
- use_tree_parent,
- is_infer_qualifier,
- })
+ path_ctx.qualified = if is_infer_qualifier {
+ Qualified::Infer
+ } else {
+ let res = sema.resolve_path(&path);
+ let is_super_chain =
+ iter::successors(Some(path.clone()), |p| p.qualifier())
+ .all(|p| p.segment().and_then(|s| s.super_token()).is_some());
+ Qualified::With { path, resolution: res, is_super_chain }
+ }
};
}
} else if let Some(segment) = path.segment() {