diff options
author | Benjamin Coenen <[email protected]> | 2020-04-11 21:54:18 +0100 |
---|---|---|
committer | Benjamin Coenen <[email protected]> | 2020-04-11 21:54:18 +0100 |
commit | d42346fed61f706d68fe888631a41ea5f2752d7f (patch) | |
tree | b9e7eac005c4c6200d6a95f191e00cb738ad31b0 /crates/ra_ide/src/display | |
parent | c1317d692321ba5ba8f138067ebefbb9559d098d (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')
-rw-r--r-- | crates/ra_ide/src/display/function_signature.rs | 57 |
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 | ||
152 | impl From<&'_ ast::FnDef> for FunctionSignature { | 156 | impl 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 |