summaryrefslogtreecommitdiff
path: root/src/syntax/source.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/syntax/source.rs')
-rw-r--r--src/syntax/source.rs10
1 files changed, 3 insertions, 7 deletions
diff --git a/src/syntax/source.rs b/src/syntax/source.rs
index 233fb367..a51da301 100644
--- a/src/syntax/source.rs
+++ b/src/syntax/source.rs
@@ -110,9 +110,7 @@ impl Source {
pub fn edit(&mut self, replace: Range<usize>, with: &str) -> Range<usize> {
let start_byte = replace.start;
let start_utf16 = self.byte_to_utf16(replace.start).unwrap();
- let mut text = std::mem::take(&mut self.text).into_inner();
- text.replace_range(replace.clone(), with);
- self.text = Prehashed::new(text);
+ self.text.update(|text| text.replace_range(replace.clone(), with));
// Remove invalidated line starts.
let line = self.byte_to_line(start_byte).unwrap();
@@ -128,10 +126,8 @@ impl Source {
.extend(lines_from(start_byte, start_utf16, &self.text[start_byte..]));
// Incrementally reparse the replaced range.
- let mut root = std::mem::take(&mut self.root).into_inner();
- let range = reparse(&mut root, &self.text, replace, with.len());
- self.root = Prehashed::new(root);
- range
+ self.root
+ .update(|root| reparse(root, &self.text, replace, with.len()))
}
/// Get the length of the file in UTF-8 encoded bytes.