Skip to content

Commit 27c7ef6

Browse files
committed
Use more natural signature for Edit::apply
1 parent 4a6fa8f commit 27c7ef6

File tree

4 files changed

+42
-20
lines changed

4 files changed

+42
-20
lines changed

crates/ra_ide/src/ssr.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -401,16 +401,22 @@ fn render_replace(
401401
ignored_comments: &Vec<Comment>,
402402
template: &SsrTemplate,
403403
) -> String {
404-
let mut builder = TextEditBuilder::default();
405-
for element in template.template.descendants() {
406-
if let Some(var) = template.placeholders.get(&element) {
407-
builder.replace(element.text_range(), binding[var].to_string())
404+
let edit = {
405+
let mut builder = TextEditBuilder::default();
406+
for element in template.template.descendants() {
407+
if let Some(var) = template.placeholders.get(&element) {
408+
builder.replace(element.text_range(), binding[var].to_string())
409+
}
408410
}
409-
}
410-
for comment in ignored_comments {
411-
builder.insert(template.template.text_range().end(), comment.syntax().to_string())
412-
}
413-
builder.finish().apply(&template.template.text().to_string())
411+
for comment in ignored_comments {
412+
builder.insert(template.template.text_range().end(), comment.syntax().to_string())
413+
}
414+
builder.finish()
415+
};
416+
417+
let mut text = template.template.text().to_string();
418+
edit.apply(&mut text);
419+
text
414420
}
415421

416422
#[cfg(test)]

crates/ra_syntax/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,8 @@ impl Parse<SourceFile> {
142142
}
143143

144144
fn full_reparse(&self, indel: &Indel) -> Parse<SourceFile> {
145-
let text = indel.apply(self.tree().syntax().text().to_string());
145+
let mut text = self.tree().syntax().text().to_string();
146+
indel.apply(&mut text);
146147
SourceFile::parse(&text)
147148
}
148149
}

crates/ra_syntax/src/parsing/reparsing.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,14 @@ fn reparse_block<'node>(
109109
}
110110

111111
fn get_text_after_edit(element: SyntaxElement, edit: &Indel) -> String {
112-
let edit =
113-
Indel::replace(edit.delete - element.text_range().start(), edit.insert.clone());
112+
let edit = Indel::replace(edit.delete - element.text_range().start(), edit.insert.clone());
114113

115-
let text = match element {
114+
let mut text = match element {
116115
NodeOrToken::Token(token) => token.text().to_string(),
117116
NodeOrToken::Node(node) => node.text().to_string(),
118117
};
119-
edit.apply(text)
118+
edit.apply(&mut text);
119+
text
120120
}
121121

122122
fn is_contextual_kw(text: &str) -> bool {
@@ -199,7 +199,11 @@ mod tests {
199199
fn do_check(before: &str, replace_with: &str, reparsed_len: u32) {
200200
let (range, before) = extract_range(before);
201201
let edit = Indel::replace(range, replace_with.to_owned());
202-
let after = edit.apply(before.clone());
202+
let after = {
203+
let mut after = before.clone();
204+
edit.apply(&mut after);
205+
after
206+
};
203207

204208
let fully_reparsed = SourceFile::parse(&after);
205209
let incrementally_reparsed: Parse<SourceFile> = {

crates/ra_text_edit/src/lib.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,10 @@ impl Indel {
3737
Indel { delete: range, insert: replace_with }
3838
}
3939

40-
pub fn apply(&self, mut text: String) -> String {
40+
pub fn apply(&self, text: &mut String) {
4141
let start: usize = self.delete.start().into();
4242
let end: usize = self.delete.end().into();
4343
text.replace_range(start..end, &self.insert);
44-
text
4544
}
4645
}
4746

@@ -76,8 +75,17 @@ impl TextEdit {
7675
&self.indels
7776
}
7877

79-
pub fn apply(&self, text: &str) -> String {
80-
let mut total_len = TextSize::of(text);
78+
pub fn apply(&self, text: &mut String) {
79+
match self.indels.len() {
80+
0 => return,
81+
1 => {
82+
self.indels[0].apply(text);
83+
return;
84+
}
85+
_ => (),
86+
}
87+
88+
let mut total_len = TextSize::of(&*text);
8189
for indel in self.indels.iter() {
8290
total_len += TextSize::of(&indel.insert);
8391
total_len -= indel.delete.end() - indel.delete.start();
@@ -95,7 +103,10 @@ impl TextEdit {
95103
}
96104
buf.push_str(&text[prev..text.len()]);
97105
assert_eq!(TextSize::of(&buf), total_len);
98-
buf
106+
107+
// FIXME: figure out a way to mutate the text in-place or reuse the
108+
// memory in some other way
109+
*text = buf
99110
}
100111

101112
pub fn apply_to_offset(&self, offset: TextSize) -> Option<TextSize> {

0 commit comments

Comments
 (0)