Skip to content

Commit 81d7cbb

Browse files
committed
Avoid allocations
1 parent a70beea commit 81d7cbb

File tree

1 file changed

+37
-32
lines changed

1 file changed

+37
-32
lines changed

crates/ide-assists/src/handlers/convert_let_else_to_match.rs

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,77 @@
1-
use syntax::ast::{edit::AstNodeEdit, AstNode, HasName, LetStmt, Pat};
1+
use hir::Semantics;
2+
use ide_db::RootDatabase;
3+
use syntax::ast::{edit::AstNodeEdit, AstNode, HasName, LetStmt, Name, Pat};
24
use syntax::T;
35

46
use crate::{AssistContext, AssistId, AssistKind, Assists};
57

68
/// Gets a list of binders in a pattern, and whether they are mut.
7-
fn binders_in_pat(pat: &Pat) -> Option<Vec<(String, bool)>> {
9+
fn binders_in_pat(
10+
acc: &mut Vec<(Name, bool)>,
11+
pat: &Pat,
12+
sem: &Semantics<RootDatabase>,
13+
) -> Option<()> {
814
use Pat::*;
915
match pat {
1016
IdentPat(p) => {
11-
let ident = p.name()?.text().to_string();
17+
let ident = p.name()?;
1218
let ismut = p.ref_token().is_none() && p.mut_token().is_some();
13-
let mut res = vec![(ident, ismut)];
19+
acc.push((ident, ismut));
1420
if let Some(inner) = p.pat() {
15-
res.extend(binders_in_pat(&inner)?);
21+
binders_in_pat(acc, &inner, sem)?;
1622
}
17-
Some(res)
23+
Some(())
1824
}
19-
BoxPat(p) => p.pat().and_then(|p| binders_in_pat(&p)),
20-
RestPat(_) | LiteralPat(_) | PathPat(_) | WildcardPat(_) | ConstBlockPat(_) => Some(vec![]),
25+
BoxPat(p) => p.pat().and_then(|p| binders_in_pat(acc, &p, sem)),
26+
RestPat(_) | LiteralPat(_) | PathPat(_) | WildcardPat(_) | ConstBlockPat(_) => Some(()),
2127
OrPat(p) => {
22-
let mut v = vec![];
2328
for p in p.pats() {
24-
v.extend(binders_in_pat(&p)?);
29+
binders_in_pat(acc, &p, sem)?;
2530
}
26-
Some(v)
31+
Some(())
2732
}
28-
ParenPat(p) => p.pat().and_then(|p| binders_in_pat(&p)),
33+
ParenPat(p) => p.pat().and_then(|p| binders_in_pat(acc, &p, sem)),
2934
RangePat(p) => {
30-
let mut start = if let Some(st) = p.start() { binders_in_pat(&st)? } else { vec![] };
31-
let end = if let Some(st) = p.end() { binders_in_pat(&st)? } else { vec![] };
32-
start.extend(end);
33-
Some(start)
35+
if let Some(st) = p.start() {
36+
binders_in_pat(acc, &st, sem)?
37+
}
38+
if let Some(ed) = p.end() {
39+
binders_in_pat(acc, &ed, sem)?
40+
}
41+
Some(())
3442
}
3543
RecordPat(p) => {
36-
let mut v = vec![];
3744
for f in p.record_pat_field_list()?.fields() {
3845
let pat = f.pat()?;
39-
v.extend(binders_in_pat(&pat)?);
46+
binders_in_pat(acc, &pat, sem)?;
4047
}
41-
Some(v)
48+
Some(())
4249
}
43-
RefPat(p) => p.pat().and_then(|p| binders_in_pat(&p)),
50+
RefPat(p) => p.pat().and_then(|p| binders_in_pat(acc, &p, sem)),
4451
SlicePat(p) => {
45-
let mut v = vec![];
4652
for p in p.pats() {
47-
v.extend(binders_in_pat(&p)?);
53+
binders_in_pat(acc, &p, sem)?;
4854
}
49-
Some(v)
55+
Some(())
5056
}
5157
TuplePat(p) => {
52-
let mut v = vec![];
5358
for p in p.fields() {
54-
v.extend(binders_in_pat(&p)?);
59+
binders_in_pat(acc, &p, sem)?;
5560
}
56-
Some(v)
61+
Some(())
5762
}
5863
TupleStructPat(p) => {
59-
let mut v = vec![];
6064
for p in p.fields() {
61-
v.extend(binders_in_pat(&p)?);
65+
binders_in_pat(acc, &p, sem)?;
6266
}
63-
Some(v)
67+
Some(())
6468
}
6569
// don't support macro pat yet
6670
MacroPat(_) => None,
6771
}
6872
}
6973

70-
fn binders_to_str(binders: &[(String, bool)], addmut: bool) -> String {
74+
fn binders_to_str(binders: &[(Name, bool)], addmut: bool) -> String {
7175
let vars = binders
7276
.iter()
7377
.map(
@@ -119,7 +123,8 @@ pub(crate) fn convert_let_else_to_match(acc: &mut Assists, ctx: &AssistContext)
119123
return None;
120124
}
121125
let pat = let_stmt.pat()?;
122-
let binders = binders_in_pat(&pat)?;
126+
let mut binders = Vec::new();
127+
binders_in_pat(&mut binders, &pat, &ctx.sema)?;
123128

124129
let target = let_stmt.syntax().text_range();
125130
acc.add(
@@ -139,7 +144,7 @@ pub(crate) fn convert_let_else_to_match(acc: &mut Assists, ctx: &AssistContext)
139144
// remove the mut from the pattern
140145
for (b, ismut) in binders.iter() {
141146
if *ismut {
142-
pat_no_mut = pat_no_mut.replace(&format!("mut {b}"), b);
147+
pat_no_mut = pat_no_mut.replace(&format!("mut {b}"), &b.to_string());
143148
}
144149
}
145150

0 commit comments

Comments
 (0)