mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-24 12:03:31 +00:00
Don't complete super
unless its valid in paths
This commit is contained in:
parent
d0fa7abc50
commit
1914b7723f
3 changed files with 34 additions and 23 deletions
|
@ -39,7 +39,8 @@ pub(crate) fn complete_attribute(acc: &mut Completions, ctx: &CompletionContext)
|
|||
}
|
||||
|
||||
fn complete_attribute_start(acc: &mut Completions, ctx: &CompletionContext, attribute: &ast::Attr) {
|
||||
for attr_completion in ATTRIBUTES {
|
||||
let is_inner = attribute.kind() == ast::AttrKind::Inner;
|
||||
for attr_completion in ATTRIBUTES.iter().filter(|compl| is_inner || !compl.prefer_inner) {
|
||||
let mut item = CompletionItem::new(
|
||||
CompletionKind::Attribute,
|
||||
ctx.source_range(),
|
||||
|
|
|
@ -25,9 +25,12 @@ pub(crate) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext)
|
|||
return;
|
||||
}
|
||||
func.param_list().into_iter().flat_map(|it| it.params()).for_each(|param| {
|
||||
let text = param.syntax().text().to_string();
|
||||
params.entry(text).or_insert(param);
|
||||
})
|
||||
if let Some(pat) = param.pat() {
|
||||
let text = param.syntax().text().to_string();
|
||||
let lookup = pat.syntax().text().to_string();
|
||||
params.entry(text).or_insert(lookup);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
for node in ctx.token.parent().ancestors() {
|
||||
|
@ -50,18 +53,12 @@ pub(crate) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext)
|
|||
};
|
||||
}
|
||||
|
||||
params
|
||||
.into_iter()
|
||||
.filter_map(|(label, param)| {
|
||||
let lookup = param.pat()?.syntax().text().to_string();
|
||||
Some((label, lookup))
|
||||
})
|
||||
.for_each(|(label, lookup)| {
|
||||
CompletionItem::new(CompletionKind::Magic, ctx.source_range(), label)
|
||||
.kind(CompletionItemKind::Binding)
|
||||
.lookup_by(lookup)
|
||||
.add_to(acc)
|
||||
});
|
||||
params.into_iter().for_each(|(label, lookup)| {
|
||||
CompletionItem::new(CompletionKind::Magic, ctx.source_range(), label)
|
||||
.kind(CompletionItemKind::Binding)
|
||||
.lookup_by(lookup)
|
||||
.add_to(acc)
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
//! Completes keywords.
|
||||
|
||||
use std::iter;
|
||||
|
||||
use syntax::SyntaxKind;
|
||||
use test_utils::mark;
|
||||
|
||||
|
@ -19,10 +21,14 @@ pub(crate) fn complete_use_tree_keyword(acc: &mut Completions, ctx: &CompletionC
|
|||
CompletionItem::new(CompletionKind::Keyword, source_range, "self")
|
||||
.kind(CompletionItemKind::Keyword)
|
||||
.add_to(acc);
|
||||
CompletionItem::new(CompletionKind::Keyword, source_range, "super::")
|
||||
.kind(CompletionItemKind::Keyword)
|
||||
.insert_text("super::")
|
||||
.add_to(acc);
|
||||
if iter::successors(ctx.path_qual.clone(), |p| p.qualifier())
|
||||
.all(|p| p.segment().and_then(|s| s.super_token()).is_some())
|
||||
{
|
||||
CompletionItem::new(CompletionKind::Keyword, source_range, "super::")
|
||||
.kind(CompletionItemKind::Keyword)
|
||||
.insert_text("super::")
|
||||
.add_to(acc);
|
||||
}
|
||||
}
|
||||
|
||||
// Suggest .await syntax for types that implement Future trait
|
||||
|
@ -204,8 +210,16 @@ mod tests {
|
|||
"#]],
|
||||
);
|
||||
|
||||
// FIXME: `self` shouldn't be shown here and the check below
|
||||
check(
|
||||
r"use a::$0",
|
||||
expect![[r#"
|
||||
kw self
|
||||
"#]],
|
||||
);
|
||||
|
||||
check(
|
||||
r"use super::$0",
|
||||
expect![[r#"
|
||||
kw self
|
||||
kw super::
|
||||
|
@ -215,9 +229,8 @@ mod tests {
|
|||
check(
|
||||
r"use a::{b, $0}",
|
||||
expect![[r#"
|
||||
kw self
|
||||
kw super::
|
||||
"#]],
|
||||
kw self
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue