diff options
-rw-r--r-- | crates/ra_assists/src/ast_editor.rs | 15 | ||||
-rw-r--r-- | crates/ra_assists/src/fill_struct_fields.rs | 27 | ||||
-rw-r--r-- | crates/ra_syntax/src/syntax_node.rs | 1 |
3 files changed, 39 insertions, 4 deletions
diff --git a/crates/ra_assists/src/ast_editor.rs b/crates/ra_assists/src/ast_editor.rs index 5bf1fc0ed..7ef58aa8e 100644 --- a/crates/ra_assists/src/ast_editor.rs +++ b/crates/ra_assists/src/ast_editor.rs | |||
@@ -110,13 +110,20 @@ impl AstEditor<ast::NamedFieldList> { | |||
110 | 110 | ||
111 | let position = match position { | 111 | let position = match position { |
112 | InsertPosition::First => after_l_curly!(), | 112 | InsertPosition::First => after_l_curly!(), |
113 | InsertPosition::Last => match self.ast().fields().last() { | 113 | InsertPosition::Last => { |
114 | Some(it) => after_field!(it), | 114 | if !is_multiline { |
115 | None => after_l_curly!(), | 115 | // don't insert comma before curly |
116 | }, | 116 | to_insert.pop(); |
117 | } | ||
118 | match self.ast().fields().last() { | ||
119 | Some(it) => after_field!(it), | ||
120 | None => after_l_curly!(), | ||
121 | } | ||
122 | } | ||
117 | InsertPosition::Before(anchor) => InsertPosition::Before(anchor.syntax().into()), | 123 | InsertPosition::Before(anchor) => InsertPosition::Before(anchor.syntax().into()), |
118 | InsertPosition::After(anchor) => after_field!(anchor), | 124 | InsertPosition::After(anchor) => after_field!(anchor), |
119 | }; | 125 | }; |
126 | |||
120 | self.ast = self.insert_children(position, to_insert.iter().cloned()); | 127 | self.ast = self.insert_children(position, to_insert.iter().cloned()); |
121 | } | 128 | } |
122 | 129 | ||
diff --git a/crates/ra_assists/src/fill_struct_fields.rs b/crates/ra_assists/src/fill_struct_fields.rs index ca128168a..302d62ab1 100644 --- a/crates/ra_assists/src/fill_struct_fields.rs +++ b/crates/ra_assists/src/fill_struct_fields.rs | |||
@@ -194,4 +194,31 @@ mod tests { | |||
194 | "#, | 194 | "#, |
195 | ); | 195 | ); |
196 | } | 196 | } |
197 | |||
198 | #[test] | ||
199 | fn fill_struct_short() { | ||
200 | check_assist( | ||
201 | fill_struct_fields, | ||
202 | r#" | ||
203 | struct S { | ||
204 | foo: u32, | ||
205 | bar: String, | ||
206 | } | ||
207 | |||
208 | fn main() { | ||
209 | let s = S {<|> }; | ||
210 | } | ||
211 | "#, | ||
212 | r#" | ||
213 | struct S { | ||
214 | foo: u32, | ||
215 | bar: String, | ||
216 | } | ||
217 | |||
218 | fn main() { | ||
219 | let s = <|>S { foo: (), bar: () }; | ||
220 | } | ||
221 | "#, | ||
222 | ); | ||
223 | } | ||
197 | } | 224 | } |
diff --git a/crates/ra_syntax/src/syntax_node.rs b/crates/ra_syntax/src/syntax_node.rs index d9591781d..628cabc29 100644 --- a/crates/ra_syntax/src/syntax_node.rs +++ b/crates/ra_syntax/src/syntax_node.rs | |||
@@ -24,6 +24,7 @@ use crate::{ | |||
24 | pub use rowan::WalkEvent; | 24 | pub use rowan::WalkEvent; |
25 | pub(crate) use rowan::{GreenNode, GreenToken}; | 25 | pub(crate) use rowan::{GreenNode, GreenToken}; |
26 | 26 | ||
27 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] | ||
27 | pub enum InsertPosition<T> { | 28 | pub enum InsertPosition<T> { |
28 | First, | 29 | First, |
29 | Last, | 30 | Last, |