diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2018-12-30 13:30:43 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2018-12-30 13:30:43 +0000 |
commit | 12d4c069bbeb6574c8b0d595eac115d4c5bb98b7 (patch) | |
tree | 6afb582a118bd97690ad46b21d231b117202cf2a | |
parent | 0e90e0436a5433c61f932c254d1cc7400022a940 (diff) | |
parent | c182aab5460fb5dc14b8c0e47fae45a09ccf0ac8 (diff) |
Merge #364
364: Parens r=matklad a=matklad
Co-authored-by: Aleksey Kladov <[email protected]>
4 files changed, 39 insertions, 17 deletions
diff --git a/crates/ra_analysis/src/completion/complete_path.rs b/crates/ra_analysis/src/completion/complete_path.rs index c73a083a4..4723a65a6 100644 --- a/crates/ra_analysis/src/completion/complete_path.rs +++ b/crates/ra_analysis/src/completion/complete_path.rs | |||
@@ -17,7 +17,7 @@ pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) -> C | |||
17 | let module_scope = module.scope(ctx.db)?; | 17 | let module_scope = module.scope(ctx.db)?; |
18 | module_scope.entries().for_each(|(name, res)| { | 18 | module_scope.entries().for_each(|(name, res)| { |
19 | CompletionItem::new(CompletionKind::Reference, name.to_string()) | 19 | CompletionItem::new(CompletionKind::Reference, name.to_string()) |
20 | .from_resolution(ctx.db, res) | 20 | .from_resolution(ctx, res) |
21 | .add_to(acc) | 21 | .add_to(acc) |
22 | }); | 22 | }); |
23 | } | 23 | } |
@@ -113,4 +113,16 @@ mod tests { | |||
113 | "Foo;Bar", | 113 | "Foo;Bar", |
114 | ); | 114 | ); |
115 | } | 115 | } |
116 | |||
117 | #[test] | ||
118 | fn dont_render_function_parens_in_use_item() { | ||
119 | check_reference_completion( | ||
120 | " | ||
121 | //- /lib.rs | ||
122 | mod m { pub fn foo() {} } | ||
123 | use crate::m::f<|>; | ||
124 | ", | ||
125 | "foo", | ||
126 | ) | ||
127 | } | ||
116 | } | 128 | } |
diff --git a/crates/ra_analysis/src/completion/complete_scope.rs b/crates/ra_analysis/src/completion/complete_scope.rs index cd98efe95..daf666505 100644 --- a/crates/ra_analysis/src/completion/complete_scope.rs +++ b/crates/ra_analysis/src/completion/complete_scope.rs | |||
@@ -34,7 +34,7 @@ pub(super) fn complete_scope(acc: &mut Completions, ctx: &CompletionContext) -> | |||
34 | }) | 34 | }) |
35 | .for_each(|(name, res)| { | 35 | .for_each(|(name, res)| { |
36 | CompletionItem::new(CompletionKind::Reference, name.to_string()) | 36 | CompletionItem::new(CompletionKind::Reference, name.to_string()) |
37 | .from_resolution(ctx.db, res) | 37 | .from_resolution(ctx, res) |
38 | .add_to(acc) | 38 | .add_to(acc) |
39 | }); | 39 | }); |
40 | Ok(()) | 40 | Ok(()) |
diff --git a/crates/ra_analysis/src/completion/completion_context.rs b/crates/ra_analysis/src/completion/completion_context.rs index 71bf7fd32..949b8135e 100644 --- a/crates/ra_analysis/src/completion/completion_context.rs +++ b/crates/ra_analysis/src/completion/completion_context.rs | |||
@@ -24,6 +24,7 @@ pub(super) struct CompletionContext<'a> { | |||
24 | pub(super) module: Option<hir::Module>, | 24 | pub(super) module: Option<hir::Module>, |
25 | pub(super) function: Option<hir::Function>, | 25 | pub(super) function: Option<hir::Function>, |
26 | pub(super) function_syntax: Option<ast::FnDef<'a>>, | 26 | pub(super) function_syntax: Option<ast::FnDef<'a>>, |
27 | pub(super) use_item_syntax: Option<ast::UseItem<'a>>, | ||
27 | pub(super) is_param: bool, | 28 | pub(super) is_param: bool, |
28 | /// A single-indent path, like `foo`. | 29 | /// A single-indent path, like `foo`. |
29 | pub(super) is_trivial_path: bool, | 30 | pub(super) is_trivial_path: bool, |
@@ -55,6 +56,7 @@ impl<'a> CompletionContext<'a> { | |||
55 | module, | 56 | module, |
56 | function: None, | 57 | function: None, |
57 | function_syntax: None, | 58 | function_syntax: None, |
59 | use_item_syntax: None, | ||
58 | is_param: false, | 60 | is_param: false, |
59 | is_trivial_path: false, | 61 | is_trivial_path: false, |
60 | path_prefix: None, | 62 | path_prefix: None, |
@@ -114,6 +116,8 @@ impl<'a> CompletionContext<'a> { | |||
114 | _ => (), | 116 | _ => (), |
115 | } | 117 | } |
116 | 118 | ||
119 | self.use_item_syntax = self.leaf.ancestors().find_map(ast::UseItem::cast); | ||
120 | |||
117 | self.function_syntax = self | 121 | self.function_syntax = self |
118 | .leaf | 122 | .leaf |
119 | .ancestors() | 123 | .ancestors() |
diff --git a/crates/ra_analysis/src/completion/completion_item.rs b/crates/ra_analysis/src/completion/completion_item.rs index b8fa39ae3..cd4d529f9 100644 --- a/crates/ra_analysis/src/completion/completion_item.rs +++ b/crates/ra_analysis/src/completion/completion_item.rs | |||
@@ -1,7 +1,7 @@ | |||
1 | use crate::db; | ||
2 | |||
3 | use hir::PerNs; | 1 | use hir::PerNs; |
4 | 2 | ||
3 | use crate::completion::CompletionContext; | ||
4 | |||
5 | /// `CompletionItem` describes a single completion variant in the editor pop-up. | 5 | /// `CompletionItem` describes a single completion variant in the editor pop-up. |
6 | /// It is basically a POD with various properties. To construct a | 6 | /// It is basically a POD with various properties. To construct a |
7 | /// `CompletionItem`, use `new` method and the `Builder` struct. | 7 | /// `CompletionItem`, use `new` method and the `Builder` struct. |
@@ -118,12 +118,12 @@ impl Builder { | |||
118 | self.kind = Some(kind); | 118 | self.kind = Some(kind); |
119 | self | 119 | self |
120 | } | 120 | } |
121 | pub(crate) fn from_resolution( | 121 | pub(super) fn from_resolution( |
122 | mut self, | 122 | mut self, |
123 | db: &db::RootDatabase, | 123 | ctx: &CompletionContext, |
124 | resolution: &hir::Resolution, | 124 | resolution: &hir::Resolution, |
125 | ) -> Builder { | 125 | ) -> Builder { |
126 | let resolved = resolution.def_id.and_then(|d| d.resolve(db).ok()); | 126 | let resolved = resolution.def_id.and_then(|d| d.resolve(ctx.db).ok()); |
127 | let kind = match resolved { | 127 | let kind = match resolved { |
128 | PerNs { | 128 | PerNs { |
129 | types: Some(hir::Def::Module(..)), | 129 | types: Some(hir::Def::Module(..)), |
@@ -140,21 +140,27 @@ impl Builder { | |||
140 | PerNs { | 140 | PerNs { |
141 | values: Some(hir::Def::Function(function)), | 141 | values: Some(hir::Def::Function(function)), |
142 | .. | 142 | .. |
143 | } => { | 143 | } => return self.from_function(ctx, function), |
144 | if let Some(sig_info) = function.signature_info(db) { | ||
145 | if sig_info.params.is_empty() { | ||
146 | self.snippet = Some(format!("{}()$0", self.label)); | ||
147 | } else { | ||
148 | self.snippet = Some(format!("{}($0)", self.label)); | ||
149 | } | ||
150 | } | ||
151 | CompletionItemKind::Function | ||
152 | } | ||
153 | _ => return self, | 144 | _ => return self, |
154 | }; | 145 | }; |
155 | self.kind = Some(kind); | 146 | self.kind = Some(kind); |
156 | self | 147 | self |
157 | } | 148 | } |
149 | |||
150 | fn from_function(mut self, ctx: &CompletionContext, function: hir::Function) -> Builder { | ||
151 | // If not an import, add parenthesis automatically. | ||
152 | if ctx.use_item_syntax.is_none() { | ||
153 | if let Some(sig_info) = function.signature_info(ctx.db) { | ||
154 | if sig_info.params.is_empty() { | ||
155 | self.snippet = Some(format!("{}()$0", self.label)); | ||
156 | } else { | ||
157 | self.snippet = Some(format!("{}($0)", self.label)); | ||
158 | } | ||
159 | } | ||
160 | } | ||
161 | self.kind = Some(CompletionItemKind::Function); | ||
162 | self | ||
163 | } | ||
158 | } | 164 | } |
159 | 165 | ||
160 | impl Into<CompletionItem> for Builder { | 166 | impl Into<CompletionItem> for Builder { |