diff options
-rw-r--r-- | crates/ra_ide/src/completion/complete_trait_impl.rs | 9 | ||||
-rw-r--r-- | crates/ra_ide/src/completion/presentation.rs | 6 | ||||
-rw-r--r-- | crates/ra_ide/src/display.rs | 38 | ||||
-rw-r--r-- | crates/ra_ide/src/display/function_signature.rs | 56 |
4 files changed, 47 insertions, 62 deletions
diff --git a/crates/ra_ide/src/completion/complete_trait_impl.rs b/crates/ra_ide/src/completion/complete_trait_impl.rs index 90f5b1c25..05e605670 100644 --- a/crates/ra_ide/src/completion/complete_trait_impl.rs +++ b/crates/ra_ide/src/completion/complete_trait_impl.rs | |||
@@ -43,7 +43,7 @@ use crate::{ | |||
43 | completion::{ | 43 | completion::{ |
44 | CompletionContext, CompletionItem, CompletionItemKind, CompletionKind, Completions, | 44 | CompletionContext, CompletionItem, CompletionItemKind, CompletionKind, Completions, |
45 | }, | 45 | }, |
46 | display::function_signature::FunctionSignature, | 46 | display::function_label, |
47 | }; | 47 | }; |
48 | 48 | ||
49 | pub(crate) fn complete_trait_impl(acc: &mut Completions, ctx: &CompletionContext) { | 49 | pub(crate) fn complete_trait_impl(acc: &mut Completions, ctx: &CompletionContext) { |
@@ -125,8 +125,6 @@ fn add_function_impl( | |||
125 | ctx: &CompletionContext, | 125 | ctx: &CompletionContext, |
126 | func: hir::Function, | 126 | func: hir::Function, |
127 | ) { | 127 | ) { |
128 | let signature = FunctionSignature::from_hir(ctx.db, func); | ||
129 | |||
130 | let fn_name = func.name(ctx.db).to_string(); | 128 | let fn_name = func.name(ctx.db).to_string(); |
131 | 129 | ||
132 | let label = if !func.params(ctx.db).is_empty() { | 130 | let label = if !func.params(ctx.db).is_empty() { |
@@ -146,13 +144,14 @@ fn add_function_impl( | |||
146 | }; | 144 | }; |
147 | let range = TextRange::new(fn_def_node.text_range().start(), ctx.source_range().end()); | 145 | let range = TextRange::new(fn_def_node.text_range().start(), ctx.source_range().end()); |
148 | 146 | ||
147 | let function_decl = function_label(&func.source(ctx.db).value); | ||
149 | match ctx.config.snippet_cap { | 148 | match ctx.config.snippet_cap { |
150 | Some(cap) => { | 149 | Some(cap) => { |
151 | let snippet = format!("{} {{\n $0\n}}", signature); | 150 | let snippet = format!("{} {{\n $0\n}}", function_decl); |
152 | builder.snippet_edit(cap, TextEdit::replace(range, snippet)) | 151 | builder.snippet_edit(cap, TextEdit::replace(range, snippet)) |
153 | } | 152 | } |
154 | None => { | 153 | None => { |
155 | let header = format!("{} {{", signature); | 154 | let header = format!("{} {{", function_decl); |
156 | builder.text_edit(TextEdit::replace(range, header)) | 155 | builder.text_edit(TextEdit::replace(range, header)) |
157 | } | 156 | } |
158 | } | 157 | } |
diff --git a/crates/ra_ide/src/completion/presentation.rs b/crates/ra_ide/src/completion/presentation.rs index e29b82017..160f2f319 100644 --- a/crates/ra_ide/src/completion/presentation.rs +++ b/crates/ra_ide/src/completion/presentation.rs | |||
@@ -11,7 +11,9 @@ use crate::{ | |||
11 | completion_item::Builder, CompletionContext, CompletionItem, CompletionItemKind, | 11 | completion_item::Builder, CompletionContext, CompletionItem, CompletionItemKind, |
12 | CompletionKind, Completions, | 12 | CompletionKind, Completions, |
13 | }, | 13 | }, |
14 | display::{const_label, function_signature::FunctionSignature, macro_label, type_label}, | 14 | display::{ |
15 | const_label, function_label, function_signature::FunctionSignature, macro_label, type_label, | ||
16 | }, | ||
15 | CompletionScore, RootDatabase, | 17 | CompletionScore, RootDatabase, |
16 | }; | 18 | }; |
17 | 19 | ||
@@ -206,7 +208,7 @@ impl Completions { | |||
206 | }) | 208 | }) |
207 | .set_documentation(func.docs(ctx.db)) | 209 | .set_documentation(func.docs(ctx.db)) |
208 | .set_deprecated(is_deprecated(func, ctx.db)) | 210 | .set_deprecated(is_deprecated(func, ctx.db)) |
209 | .detail(function_signature.to_string()); | 211 | .detail(function_label(&ast_node)); |
210 | 212 | ||
211 | let params = function_signature | 213 | let params = function_signature |
212 | .parameter_names | 214 | .parameter_names |
diff --git a/crates/ra_ide/src/display.rs b/crates/ra_ide/src/display.rs index 1ec946369..9d413cf0a 100644 --- a/crates/ra_ide/src/display.rs +++ b/crates/ra_ide/src/display.rs | |||
@@ -13,10 +13,46 @@ use ra_syntax::{ | |||
13 | pub(crate) use navigation_target::{ToNav, TryToNav}; | 13 | pub(crate) use navigation_target::{ToNav, TryToNav}; |
14 | pub(crate) use short_label::ShortLabel; | 14 | pub(crate) use short_label::ShortLabel; |
15 | 15 | ||
16 | use ast::VisibilityOwner; | ||
16 | pub use navigation_target::NavigationTarget; | 17 | pub use navigation_target::NavigationTarget; |
18 | use stdx::format_to; | ||
17 | 19 | ||
18 | pub(crate) fn function_label(node: &ast::FnDef) -> String { | 20 | pub(crate) fn function_label(node: &ast::FnDef) -> String { |
19 | function_signature::FunctionSignature::from(node).to_string() | 21 | let mut buf = String::new(); |
22 | if let Some(vis) = node.visibility() { | ||
23 | format_to!(buf, "{} ", vis); | ||
24 | } | ||
25 | if node.async_token().is_some() { | ||
26 | format_to!(buf, "async "); | ||
27 | } | ||
28 | if node.const_token().is_some() { | ||
29 | format_to!(buf, "const "); | ||
30 | } | ||
31 | if node.unsafe_token().is_some() { | ||
32 | format_to!(buf, "unsafe "); | ||
33 | } | ||
34 | if let Some(abi) = node.abi() { | ||
35 | // Keyword `extern` is included in the string. | ||
36 | format_to!(buf, "{} ", abi); | ||
37 | } | ||
38 | if let Some(name) = node.name() { | ||
39 | format_to!(buf, "fn {}", name) | ||
40 | } | ||
41 | if let Some(type_params) = node.type_param_list() { | ||
42 | format_to!(buf, "{}", type_params); | ||
43 | } | ||
44 | if let Some(param_list) = node.param_list() { | ||
45 | format_to!(buf, "{}", param_list); | ||
46 | } | ||
47 | if let Some(ret_type) = node.ret_type() { | ||
48 | if ret_type.type_ref().is_some() { | ||
49 | format_to!(buf, " {}", ret_type); | ||
50 | } | ||
51 | } | ||
52 | if let Some(where_clause) = node.where_clause() { | ||
53 | format_to!(buf, "\n{}", where_clause); | ||
54 | } | ||
55 | buf | ||
20 | } | 56 | } |
21 | 57 | ||
22 | pub(crate) fn const_label(node: &ast::ConstDef) -> String { | 58 | pub(crate) fn const_label(node: &ast::ConstDef) -> String { |
diff --git a/crates/ra_ide/src/display/function_signature.rs b/crates/ra_ide/src/display/function_signature.rs index 9b7220d1f..77551117b 100644 --- a/crates/ra_ide/src/display/function_signature.rs +++ b/crates/ra_ide/src/display/function_signature.rs | |||
@@ -2,15 +2,12 @@ | |||
2 | 2 | ||
3 | // FIXME: this modules relies on strings and AST way too much, and it should be | 3 | // FIXME: this modules relies on strings and AST way too much, and it should be |
4 | // rewritten (matklad 2020-05-07) | 4 | // rewritten (matklad 2020-05-07) |
5 | use std::{ | 5 | use std::convert::From; |
6 | convert::From, | ||
7 | fmt::{self, Display}, | ||
8 | }; | ||
9 | 6 | ||
10 | use hir::{Docs, Documentation, HasSource, HirDisplay}; | 7 | use hir::{Docs, Documentation, HasSource, HirDisplay}; |
11 | use ra_ide_db::RootDatabase; | 8 | use ra_ide_db::RootDatabase; |
12 | use ra_syntax::ast::{self, AstNode, NameOwner, VisibilityOwner}; | 9 | use ra_syntax::ast::{self, AstNode, NameOwner, VisibilityOwner}; |
13 | use stdx::{split_delim, SepBy}; | 10 | use stdx::split_delim; |
14 | 11 | ||
15 | use crate::display::{generic_parameters, where_predicates}; | 12 | use crate::display::{generic_parameters, where_predicates}; |
16 | 13 | ||
@@ -247,52 +244,3 @@ impl From<&'_ ast::FnDef> for FunctionSignature { | |||
247 | } | 244 | } |
248 | } | 245 | } |
249 | } | 246 | } |
250 | |||
251 | impl Display for FunctionSignature { | ||
252 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
253 | if let Some(t) = &self.visibility { | ||
254 | write!(f, "{} ", t)?; | ||
255 | } | ||
256 | |||
257 | if self.qualifier.is_async { | ||
258 | write!(f, "async ")?; | ||
259 | } | ||
260 | |||
261 | if self.qualifier.is_const { | ||
262 | write!(f, "const ")?; | ||
263 | } | ||
264 | |||
265 | if self.qualifier.is_unsafe { | ||
266 | write!(f, "unsafe ")?; | ||
267 | } | ||
268 | |||
269 | if let Some(extern_abi) = &self.qualifier.extern_abi { | ||
270 | // Keyword `extern` is included in the string. | ||
271 | write!(f, "{} ", extern_abi)?; | ||
272 | } | ||
273 | |||
274 | if let Some(name) = &self.name { | ||
275 | match self.kind { | ||
276 | CallableKind::Function => write!(f, "fn {}", name)?, | ||
277 | CallableKind::StructConstructor => write!(f, "struct {}", name)?, | ||
278 | CallableKind::VariantConstructor => write!(f, "{}", name)?, | ||
279 | } | ||
280 | } | ||
281 | |||
282 | if !self.generic_parameters.is_empty() { | ||
283 | write!(f, "{}", self.generic_parameters.iter().sep_by(", ").surround_with("<", ">"))?; | ||
284 | } | ||
285 | |||
286 | write!(f, "{}", self.parameters.iter().sep_by(", ").surround_with("(", ")"))?; | ||
287 | |||
288 | if let Some(t) = &self.ret_type { | ||
289 | write!(f, " -> {}", t)?; | ||
290 | } | ||
291 | |||
292 | if !self.where_predicates.is_empty() { | ||
293 | write!(f, "\nwhere {}", self.where_predicates.iter().sep_by(",\n "))?; | ||
294 | } | ||
295 | |||
296 | Ok(()) | ||
297 | } | ||
298 | } | ||