mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 22:01:37 +00:00
Got the magic completion working.
This commit is contained in:
parent
5216b09ed6
commit
f801723dd2
2 changed files with 16 additions and 41 deletions
|
@ -6,13 +6,12 @@ use hir::{ self, db::HirDatabase };
|
||||||
use ra_syntax::{ SyntaxKind, ast, ast::AstNode, TextRange };
|
use ra_syntax::{ SyntaxKind, ast, ast::AstNode, TextRange };
|
||||||
|
|
||||||
pub(crate) fn complete_trait_impl(acc: &mut Completions, ctx: &CompletionContext) {
|
pub(crate) fn complete_trait_impl(acc: &mut Completions, ctx: &CompletionContext) {
|
||||||
let item_list = ast::ItemList::cast(ctx.token.parent());
|
let impl_block = ctx.impl_block.as_ref();
|
||||||
let impl_block = item_list
|
let item_list = impl_block.and_then(|i| i.item_list());
|
||||||
.clone()
|
|
||||||
.and_then(|i| i.syntax().parent())
|
|
||||||
.and_then(|p| ast::ImplBlock::cast(p));
|
|
||||||
|
|
||||||
if item_list.is_none() || impl_block.is_none() {
|
if item_list.is_none()
|
||||||
|
|| impl_block.is_none()
|
||||||
|
|| ctx.function_syntax.is_some() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,7 +165,8 @@ pub(crate) fn add_function_impl(acc: &mut Completions, ctx: &CompletionContext,
|
||||||
format!("fn {}()", func_name.to_string())
|
format!("fn {}()", func_name.to_string())
|
||||||
};
|
};
|
||||||
|
|
||||||
let builder = CompletionItem::new(CompletionKind::Magic, start, label);
|
let builder = CompletionItem::new(CompletionKind::Magic, start, label.clone())
|
||||||
|
.lookup_by(label);
|
||||||
|
|
||||||
let completion_kind = if func.has_self_param(ctx.db) {
|
let completion_kind = if func.has_self_param(ctx.db) {
|
||||||
CompletionItemKind::Method
|
CompletionItemKind::Method
|
||||||
|
@ -183,7 +183,6 @@ pub(crate) fn add_function_impl(acc: &mut Completions, ctx: &CompletionContext,
|
||||||
builder
|
builder
|
||||||
.insert_text(snippet)
|
.insert_text(snippet)
|
||||||
.kind(completion_kind)
|
.kind(completion_kind)
|
||||||
.lookup_by(func_name.to_string())
|
|
||||||
.add_to(acc);
|
.add_to(acc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +218,6 @@ mod tests {
|
||||||
delete: [138; 138),
|
delete: [138; 138),
|
||||||
insert: "fn foo() {}",
|
insert: "fn foo() {}",
|
||||||
kind: Function,
|
kind: Function,
|
||||||
lookup: "foo",
|
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
"###);
|
"###);
|
||||||
|
@ -251,7 +249,6 @@ mod tests {
|
||||||
delete: [193; 193),
|
delete: [193; 193),
|
||||||
insert: "fn bar() {}",
|
insert: "fn bar() {}",
|
||||||
kind: Function,
|
kind: Function,
|
||||||
lookup: "bar",
|
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
"###);
|
"###);
|
||||||
|
@ -280,7 +277,6 @@ mod tests {
|
||||||
delete: [141; 141),
|
delete: [141; 141),
|
||||||
insert: "fn foo<T>() {}",
|
insert: "fn foo<T>() {}",
|
||||||
kind: Function,
|
kind: Function,
|
||||||
lookup: "foo",
|
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
"###);
|
"###);
|
||||||
|
@ -309,36 +305,6 @@ mod tests {
|
||||||
delete: [163; 163),
|
delete: [163; 163),
|
||||||
insert: "fn foo<T>()\nwhere T: Into<String> {}",
|
insert: "fn foo<T>()\nwhere T: Into<String> {}",
|
||||||
kind: Function,
|
kind: Function,
|
||||||
lookup: "foo",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
"###);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn start_from_fn_kw() {
|
|
||||||
let completions = complete(
|
|
||||||
r"
|
|
||||||
trait Test {
|
|
||||||
fn foo();
|
|
||||||
}
|
|
||||||
|
|
||||||
struct T1;
|
|
||||||
|
|
||||||
impl Test for T1 {
|
|
||||||
fn <|>
|
|
||||||
}
|
|
||||||
",
|
|
||||||
);
|
|
||||||
assert_debug_snapshot!(completions, @r###"
|
|
||||||
[
|
|
||||||
CompletionItem {
|
|
||||||
label: "fn foo()",
|
|
||||||
source_range: [138; 140),
|
|
||||||
delete: [138; 140),
|
|
||||||
insert: "fn foo() {}",
|
|
||||||
kind: Function,
|
|
||||||
lookup: "foo",
|
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
"###);
|
"###);
|
||||||
|
|
|
@ -24,6 +24,7 @@ pub(crate) struct CompletionContext<'a> {
|
||||||
pub(super) use_item_syntax: Option<ast::UseItem>,
|
pub(super) use_item_syntax: Option<ast::UseItem>,
|
||||||
pub(super) record_lit_syntax: Option<ast::RecordLit>,
|
pub(super) record_lit_syntax: Option<ast::RecordLit>,
|
||||||
pub(super) record_lit_pat: Option<ast::RecordPat>,
|
pub(super) record_lit_pat: Option<ast::RecordPat>,
|
||||||
|
pub(super) impl_block: Option<ast::ImplBlock>,
|
||||||
pub(super) is_param: bool,
|
pub(super) is_param: bool,
|
||||||
/// If a name-binding or reference to a const in a pattern.
|
/// If a name-binding or reference to a const in a pattern.
|
||||||
/// Irrefutable patterns (like let) are excluded.
|
/// Irrefutable patterns (like let) are excluded.
|
||||||
|
@ -71,6 +72,7 @@ impl<'a> CompletionContext<'a> {
|
||||||
use_item_syntax: None,
|
use_item_syntax: None,
|
||||||
record_lit_syntax: None,
|
record_lit_syntax: None,
|
||||||
record_lit_pat: None,
|
record_lit_pat: None,
|
||||||
|
impl_block: None,
|
||||||
is_param: false,
|
is_param: false,
|
||||||
is_pat_binding: false,
|
is_pat_binding: false,
|
||||||
is_trivial_path: false,
|
is_trivial_path: false,
|
||||||
|
@ -147,6 +149,13 @@ impl<'a> CompletionContext<'a> {
|
||||||
self.record_lit_syntax = find_node_at_offset(original_file.syntax(), self.offset);
|
self.record_lit_syntax = find_node_at_offset(original_file.syntax(), self.offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.impl_block = self
|
||||||
|
.token
|
||||||
|
.parent()
|
||||||
|
.ancestors()
|
||||||
|
.take_while(|it| it.kind() != SOURCE_FILE && it.kind() != MODULE)
|
||||||
|
.find_map(ast::ImplBlock::cast);
|
||||||
|
|
||||||
let top_node = name_ref
|
let top_node = name_ref
|
||||||
.syntax()
|
.syntax()
|
||||||
.ancestors()
|
.ancestors()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue