aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/completion
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api/src/completion')
-rw-r--r--crates/ra_ide_api/src/completion/complete_dot.rs4
-rw-r--r--crates/ra_ide_api/src/completion/complete_fn_param.rs9
-rw-r--r--crates/ra_ide_api/src/completion/complete_path.rs12
-rw-r--r--crates/ra_ide_api/src/completion/complete_postfix.rs6
-rw-r--r--crates/ra_ide_api/src/completion/complete_scope.rs10
-rw-r--r--crates/ra_ide_api/src/completion/completion_context.rs8
-rw-r--r--crates/ra_ide_api/src/completion/completion_item.rs16
7 files changed, 19 insertions, 46 deletions
diff --git a/crates/ra_ide_api/src/completion/complete_dot.rs b/crates/ra_ide_api/src/completion/complete_dot.rs
index bad51cc51..a673dbdcf 100644
--- a/crates/ra_ide_api/src/completion/complete_dot.rs
+++ b/crates/ra_ide_api/src/completion/complete_dot.rs
@@ -25,9 +25,7 @@ pub(super) fn complete_dot(acc: &mut Completions, ctx: &CompletionContext) {
25fn complete_fields(acc: &mut Completions, ctx: &CompletionContext, receiver: Ty) { 25fn complete_fields(acc: &mut Completions, ctx: &CompletionContext, receiver: Ty) {
26 for receiver in receiver.autoderef(ctx.db) { 26 for receiver in receiver.autoderef(ctx.db) {
27 match receiver { 27 match receiver {
28 Ty::Adt { 28 Ty::Adt { def_id, ref substs, .. } => {
29 def_id, ref substs, ..
30 } => {
31 match def_id { 29 match def_id {
32 AdtDef::Struct(s) => { 30 AdtDef::Struct(s) => {
33 for field in s.fields(ctx.db) { 31 for field in s.fields(ctx.db) {
diff --git a/crates/ra_ide_api/src/completion/complete_fn_param.rs b/crates/ra_ide_api/src/completion/complete_fn_param.rs
index 8d4df4ea1..43532226f 100644
--- a/crates/ra_ide_api/src/completion/complete_fn_param.rs
+++ b/crates/ra_ide_api/src/completion/complete_fn_param.rs
@@ -43,13 +43,12 @@ pub(super) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext)
43 node: &'a N, 43 node: &'a N,
44 params: &mut FxHashMap<String, (u32, &'a ast::Param)>, 44 params: &mut FxHashMap<String, (u32, &'a ast::Param)>,
45 ) { 45 ) {
46 node.functions() 46 node.functions().filter_map(|it| it.param_list()).flat_map(|it| it.params()).for_each(
47 .filter_map(|it| it.param_list()) 47 |param| {
48 .flat_map(|it| it.params())
49 .for_each(|param| {
50 let text = param.syntax().text().to_string(); 48 let text = param.syntax().text().to_string();
51 params.entry(text).or_insert((0, param)).0 += 1; 49 params.entry(text).or_insert((0, param)).0 += 1;
52 }) 50 },
51 )
53 } 52 }
54} 53}
55 54
diff --git a/crates/ra_ide_api/src/completion/complete_path.rs b/crates/ra_ide_api/src/completion/complete_path.rs
index 0b9948d4b..c47a14e9f 100644
--- a/crates/ra_ide_api/src/completion/complete_path.rs
+++ b/crates/ra_ide_api/src/completion/complete_path.rs
@@ -31,14 +31,10 @@ pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) {
31 hir::ModuleDef::Enum(e) => { 31 hir::ModuleDef::Enum(e) => {
32 e.variants(ctx.db).into_iter().for_each(|variant| { 32 e.variants(ctx.db).into_iter().for_each(|variant| {
33 if let Some(name) = variant.name(ctx.db) { 33 if let Some(name) = variant.name(ctx.db) {
34 let detail_types = variant 34 let detail_types =
35 .fields(ctx.db) 35 variant.fields(ctx.db).into_iter().map(|field| field.ty(ctx.db));
36 .into_iter() 36 let detail =
37 .map(|field| field.ty(ctx.db)); 37 join(detail_types).separator(", ").surround_with("(", ")").to_string();
38 let detail = join(detail_types)
39 .separator(", ")
40 .surround_with("(", ")")
41 .to_string();
42 38
43 CompletionItem::new( 39 CompletionItem::new(
44 CompletionKind::Reference, 40 CompletionKind::Reference,
diff --git a/crates/ra_ide_api/src/completion/complete_postfix.rs b/crates/ra_ide_api/src/completion/complete_postfix.rs
index e3a739d6d..10a3c8db7 100644
--- a/crates/ra_ide_api/src/completion/complete_postfix.rs
+++ b/crates/ra_ide_api/src/completion/complete_postfix.rs
@@ -17,11 +17,7 @@ use ra_text_edit::TextEditBuilder;
17 17
18fn postfix_snippet(ctx: &CompletionContext, label: &str, snippet: &str) -> Builder { 18fn postfix_snippet(ctx: &CompletionContext, label: &str, snippet: &str) -> Builder {
19 let replace_range = ctx.source_range(); 19 let replace_range = ctx.source_range();
20 let receiver_range = ctx 20 let receiver_range = ctx.dot_receiver.expect("no receiver available").syntax().range();
21 .dot_receiver
22 .expect("no receiver available")
23 .syntax()
24 .range();
25 let delete_range = TextRange::from_to(receiver_range.start(), replace_range.start()); 21 let delete_range = TextRange::from_to(receiver_range.start(), replace_range.start());
26 let mut builder = TextEditBuilder::default(); 22 let mut builder = TextEditBuilder::default();
27 builder.delete(delete_range); 23 builder.delete(delete_range);
diff --git a/crates/ra_ide_api/src/completion/complete_scope.rs b/crates/ra_ide_api/src/completion/complete_scope.rs
index 8674b1e66..445788407 100644
--- a/crates/ra_ide_api/src/completion/complete_scope.rs
+++ b/crates/ra_ide_api/src/completion/complete_scope.rs
@@ -7,13 +7,9 @@ pub(super) fn complete_scope(acc: &mut Completions, ctx: &CompletionContext) {
7 let names = ctx.resolver.all_names(); 7 let names = ctx.resolver.all_names();
8 8
9 names.into_iter().for_each(|(name, res)| { 9 names.into_iter().for_each(|(name, res)| {
10 CompletionItem::new( 10 CompletionItem::new(CompletionKind::Reference, ctx.source_range(), name.to_string())
11 CompletionKind::Reference, 11 .from_resolution(ctx, &res)
12 ctx.source_range(), 12 .add_to(acc)
13 name.to_string(),
14 )
15 .from_resolution(ctx, &res)
16 .add_to(acc)
17 }); 13 });
18} 14}
19 15
diff --git a/crates/ra_ide_api/src/completion/completion_context.rs b/crates/ra_ide_api/src/completion/completion_context.rs
index 8abab0221..82bd4d606 100644
--- a/crates/ra_ide_api/src/completion/completion_context.rs
+++ b/crates/ra_ide_api/src/completion/completion_context.rs
@@ -108,12 +108,8 @@ impl<'a> CompletionContext<'a> {
108 } 108 }
109 fn classify_name_ref(&mut self, original_file: &'a SourceFile, name_ref: &ast::NameRef) { 109 fn classify_name_ref(&mut self, original_file: &'a SourceFile, name_ref: &ast::NameRef) {
110 let name_range = name_ref.syntax().range(); 110 let name_range = name_ref.syntax().range();
111 let top_node = name_ref 111 let top_node =
112 .syntax() 112 name_ref.syntax().ancestors().take_while(|it| it.range() == name_range).last().unwrap();
113 .ancestors()
114 .take_while(|it| it.range() == name_range)
115 .last()
116 .unwrap();
117 113
118 match top_node.parent().map(|it| it.kind()) { 114 match top_node.parent().map(|it| it.kind()) {
119 Some(SOURCE_FILE) | Some(ITEM_LIST) => { 115 Some(SOURCE_FILE) | Some(ITEM_LIST) => {
diff --git a/crates/ra_ide_api/src/completion/completion_item.rs b/crates/ra_ide_api/src/completion/completion_item.rs
index 92e6e78bf..7b8972af0 100644
--- a/crates/ra_ide_api/src/completion/completion_item.rs
+++ b/crates/ra_ide_api/src/completion/completion_item.rs
@@ -105,10 +105,7 @@ impl CompletionItem {
105 } 105 }
106 /// What string is used for filtering. 106 /// What string is used for filtering.
107 pub fn lookup(&self) -> &str { 107 pub fn lookup(&self) -> &str {
108 self.lookup 108 self.lookup.as_ref().map(|it| it.as_str()).unwrap_or_else(|| self.label())
109 .as_ref()
110 .map(|it| it.as_str())
111 .unwrap_or_else(|| self.label())
112 } 109 }
113 110
114 pub fn insert_text_format(&self) -> InsertTextFormat { 111 pub fn insert_text_format(&self) -> InsertTextFormat {
@@ -214,10 +211,7 @@ impl Builder {
214 ) -> Builder { 211 ) -> Builder {
215 use hir::ModuleDef::*; 212 use hir::ModuleDef::*;
216 213
217 let def = resolution 214 let def = resolution.as_ref().take_types().or_else(|| resolution.as_ref().take_values());
218 .as_ref()
219 .take_types()
220 .or_else(|| resolution.as_ref().take_values());
221 let def = match def { 215 let def = match def {
222 None => return self, 216 None => return self,
223 Some(it) => it, 217 Some(it) => it,
@@ -323,10 +317,8 @@ pub(crate) fn check_completion(test_name: &str, code: &str, kind: CompletionKind
323 }; 317 };
324 let completions = completions(&analysis.db, position).unwrap(); 318 let completions = completions(&analysis.db, position).unwrap();
325 let completion_items: Vec<CompletionItem> = completions.into(); 319 let completion_items: Vec<CompletionItem> = completions.into();
326 let mut kind_completions: Vec<CompletionItem> = completion_items 320 let mut kind_completions: Vec<CompletionItem> =
327 .into_iter() 321 completion_items.into_iter().filter(|c| c.completion_kind == kind).collect();
328 .filter(|c| c.completion_kind == kind)
329 .collect();
330 kind_completions.sort_by_key(|c| c.label.clone()); 322 kind_completions.sort_by_key(|c| c.label.clone());
331 assert_debug_snapshot_matches!(test_name, kind_completions); 323 assert_debug_snapshot_matches!(test_name, kind_completions);
332} 324}