aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide/src/display/function_signature.rs
diff options
context:
space:
mode:
authorBenjamin Coenen <[email protected]>2020-04-11 21:54:18 +0100
committerBenjamin Coenen <[email protected]>2020-04-11 21:54:18 +0100
commitd42346fed61f706d68fe888631a41ea5f2752d7f (patch)
treeb9e7eac005c4c6200d6a95f191e00cb738ad31b0 /crates/ra_ide/src/display/function_signature.rs
parentc1317d692321ba5ba8f138067ebefbb9559d098d (diff)
Improve autocompletion by looking on the type and name
Signed-off-by: Benjamin Coenen <[email protected]>
Diffstat (limited to 'crates/ra_ide/src/display/function_signature.rs')
-rw-r--r--crates/ra_ide/src/display/function_signature.rs57
1 files changed, 36 insertions, 21 deletions
diff --git a/crates/ra_ide/src/display/function_signature.rs b/crates/ra_ide/src/display/function_signature.rs
index b967a6816..e58a78271 100644
--- a/crates/ra_ide/src/display/function_signature.rs
+++ b/crates/ra_ide/src/display/function_signature.rs
@@ -36,6 +36,8 @@ pub struct FunctionSignature {
36 pub parameters: Vec<String>, 36 pub parameters: Vec<String>,
37 /// Parameter names of the function 37 /// Parameter names of the function
38 pub parameter_names: Vec<String>, 38 pub parameter_names: Vec<String>,
39 /// Parameter types of the function
40 pub parameter_types: Vec<String>,
39 /// Optional return type 41 /// Optional return type
40 pub ret_type: Option<String>, 42 pub ret_type: Option<String>,
41 /// Where predicates 43 /// Where predicates
@@ -62,14 +64,14 @@ impl FunctionSignature {
62 return None; 64 return None;
63 }; 65 };
64 66
65 let params = st 67 let mut params = vec![];
66 .fields(db) 68 let mut parameter_types = vec![];
67 .into_iter() 69 for field in st.fields(db).into_iter() {
68 .map(|field: hir::StructField| { 70 let ty = field.signature_ty(db);
69 let ty = field.signature_ty(db); 71 let raw_param = format!("{}", ty.display(db));
70 format!("{}", ty.display(db)) 72 parameter_types.push(raw_param.split(':').nth(1).unwrap()[1..].to_string());
71 }) 73 params.push(raw_param);
72 .collect(); 74 }
73 75
74 Some( 76 Some(
75 FunctionSignature { 77 FunctionSignature {
@@ -79,6 +81,7 @@ impl FunctionSignature {
79 ret_type: node.name().map(|n| n.text().to_string()), 81 ret_type: node.name().map(|n| n.text().to_string()),
80 parameters: params, 82 parameters: params,
81 parameter_names: vec![], 83 parameter_names: vec![],
84 parameter_types,
82 generic_parameters: generic_parameters(&node), 85 generic_parameters: generic_parameters(&node),
83 where_predicates: where_predicates(&node), 86 where_predicates: where_predicates(&node),
84 doc: None, 87 doc: None,
@@ -99,15 +102,14 @@ impl FunctionSignature {
99 102
100 let name = format!("{}::{}", parent_name, variant.name(db)); 103 let name = format!("{}::{}", parent_name, variant.name(db));
101 104
102 let params = variant 105 let mut params = vec![];
103 .fields(db) 106 let mut parameter_types = vec![];
104 .into_iter() 107 for field in variant.fields(db).into_iter() {
105 .map(|field: hir::StructField| { 108 let ty = field.signature_ty(db);
106 let name = field.name(db); 109 let raw_param = format!("{}", ty.display(db));
107 let ty = field.signature_ty(db); 110 parameter_types.push(raw_param.split(':').nth(1).unwrap()[1..].to_string());
108 format!("{}: {}", name, ty.display(db)) 111 params.push(raw_param);
109 }) 112 }
110 .collect();
111 113
112 Some( 114 Some(
113 FunctionSignature { 115 FunctionSignature {
@@ -117,6 +119,7 @@ impl FunctionSignature {
117 ret_type: None, 119 ret_type: None,
118 parameters: params, 120 parameters: params,
119 parameter_names: vec![], 121 parameter_names: vec![],
122 parameter_types,
120 generic_parameters: vec![], 123 generic_parameters: vec![],
121 where_predicates: vec![], 124 where_predicates: vec![],
122 doc: None, 125 doc: None,
@@ -139,6 +142,7 @@ impl FunctionSignature {
139 ret_type: None, 142 ret_type: None,
140 parameters: params, 143 parameters: params,
141 parameter_names: vec![], 144 parameter_names: vec![],
145 parameter_types: vec![],
142 generic_parameters: vec![], 146 generic_parameters: vec![],
143 where_predicates: vec![], 147 where_predicates: vec![],
144 doc: None, 148 doc: None,
@@ -151,18 +155,28 @@ impl FunctionSignature {
151 155
152impl From<&'_ ast::FnDef> for FunctionSignature { 156impl From<&'_ ast::FnDef> for FunctionSignature {
153 fn from(node: &ast::FnDef) -> FunctionSignature { 157 fn from(node: &ast::FnDef) -> FunctionSignature {
154 fn param_list(node: &ast::FnDef) -> (bool, Vec<String>) { 158 fn param_list(node: &ast::FnDef) -> (bool, Vec<String>, Vec<String>) {
155 let mut res = vec![]; 159 let mut res = vec![];
160 let mut res_types = vec![];
156 let mut has_self_param = false; 161 let mut has_self_param = false;
157 if let Some(param_list) = node.param_list() { 162 if let Some(param_list) = node.param_list() {
158 if let Some(self_param) = param_list.self_param() { 163 if let Some(self_param) = param_list.self_param() {
159 has_self_param = true; 164 has_self_param = true;
160 res.push(self_param.syntax().text().to_string()) 165 let raw_param = self_param.syntax().text().to_string();
166
167 // TODO: better solution ?
168 res_types.push(
169 raw_param.split(':').nth(1).unwrap_or_else(|| " Self")[1..].to_string(),
170 );
171 res.push(raw_param);
161 } 172 }
162 173
163 res.extend(param_list.params().map(|param| param.syntax().text().to_string())); 174 res.extend(param_list.params().map(|param| param.syntax().text().to_string()));
175 res_types.extend(param_list.params().map(|param| {
176 param.syntax().text().to_string().split(':').nth(1).unwrap()[1..].to_string()
177 }));
164 } 178 }
165 (has_self_param, res) 179 (has_self_param, res, res_types)
166 } 180 }
167 181
168 fn param_name_list(node: &ast::FnDef) -> Vec<String> { 182 fn param_name_list(node: &ast::FnDef) -> Vec<String> {
@@ -192,7 +206,7 @@ impl From<&'_ ast::FnDef> for FunctionSignature {
192 res 206 res
193 } 207 }
194 208
195 let (has_self_param, parameters) = param_list(node); 209 let (has_self_param, parameters, parameter_types) = param_list(node);
196 210
197 FunctionSignature { 211 FunctionSignature {
198 kind: CallableKind::Function, 212 kind: CallableKind::Function,
@@ -204,6 +218,7 @@ impl From<&'_ ast::FnDef> for FunctionSignature {
204 .map(|n| n.syntax().text().to_string()), 218 .map(|n| n.syntax().text().to_string()),
205 parameters, 219 parameters,
206 parameter_names: param_name_list(node), 220 parameter_names: param_name_list(node),
221 parameter_types,
207 generic_parameters: generic_parameters(node), 222 generic_parameters: generic_parameters(node),
208 where_predicates: where_predicates(node), 223 where_predicates: where_predicates(node),
209 // docs are processed separately 224 // docs are processed separately