Skip to content

Commit 99c4560

Browse files
committed
Improve performance and ordering
1 parent ba68637 commit 99c4560

File tree

1 file changed

+15
-21
lines changed

1 file changed

+15
-21
lines changed

crates/ra_assists/src/fill_struct_fields.rs

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::fmt::Write;
22

3-
use hir::{AdtDef, Ty, db::HirDatabase, source_binder::function_from_child_node, StructField};
3+
use hir::{AdtDef, Ty, db::HirDatabase, source_binder::function_from_child_node};
44

55
use ra_syntax::ast::{self, AstNode};
66

@@ -26,7 +26,7 @@ pub(crate) fn fill_struct_fields(mut ctx: AssistCtx<impl HirDatabase>) -> Option
2626
struct FillStructFields<'a, 'b: 'a, DB> {
2727
ctx: &'a mut AssistCtx<'b, DB>,
2828
named_field_list: &'a ast::NamedFieldList,
29-
struct_fields: Vec<StructField>,
29+
struct_fields: Vec<(String, String)>,
3030
struct_lit: &'a ast::StructLit,
3131
}
3232

@@ -64,35 +64,29 @@ where
6464
Ty::Adt { def_id: AdtDef::Struct(s), .. } => s,
6565
_ => return None,
6666
};
67-
self.struct_fields = struct_def.fields(self.ctx.db);
67+
self.struct_fields = struct_def
68+
.fields(self.ctx.db)
69+
.into_iter()
70+
.map(|f| (f.name(self.ctx.db).to_string(), "()".into()))
71+
.collect();
6872
Some(())
6973
}
7074

7175
fn remove_already_included_fields(&mut self) -> Option<()> {
7276
for ast_field in self.named_field_list.fields() {
77+
let expr = ast_field.expr()?.syntax().text().to_string();
7378
let name_from_ast = ast_field.name_ref()?.text().to_string();
74-
if let Some(idx) = self
75-
.struct_fields
76-
.iter()
77-
.map(|f| f.name(self.ctx.db).to_string())
78-
.position(|n| n == name_from_ast)
79-
{
80-
self.struct_fields.remove(idx);
79+
if let Some(idx) = self.struct_fields.iter().position(|(n, _)| n == &name_from_ast) {
80+
self.struct_fields[idx] = (name_from_ast, expr);
8181
}
8282
}
8383
Some(())
8484
}
8585

86-
fn struct_fields_string(&self) -> Option<String> {
86+
fn struct_fields_string(&mut self) -> Option<String> {
8787
let mut buf = String::from("{\n");
88-
for field in self.named_field_list.fields() {
89-
let expr = field.expr()?.syntax().text().to_string();
90-
let field_name = field.name_ref()?.syntax().text().to_string();
91-
write!(&mut buf, " {}: {},\n", field_name, expr).unwrap();
92-
}
93-
for field in &self.struct_fields {
94-
let field_name = field.name(self.ctx.db).to_string();
95-
write!(&mut buf, " {}: (),\n", field_name).unwrap();
88+
for (name, expr) in &self.struct_fields {
89+
write!(&mut buf, " {}: {},\n", name, expr).unwrap();
9690
}
9791
buf.push_str("}");
9892
Some(buf)
@@ -233,11 +227,11 @@ mod tests {
233227
234228
fn main() {
235229
let s = <|>S {
236-
c: (1, 2),
237-
e: "foo",
238230
a: (),
239231
b: (),
232+
c: (1, 2),
240233
d: (),
234+
e: "foo",
241235
}
242236
}
243237
"#,

0 commit comments

Comments
 (0)