Use slice from Rope chunk when possible while iterating lines (#37430)

Release Notes:

- N/A
This commit is contained in:
Michael Sloan
2025-09-03 00:35:31 -06:00
committed by GitHub
parent 8d5861322b
commit d7fd5910d7

View File

@@ -936,24 +936,36 @@ impl Lines<'_> {
self.current_line.clear();
while let Some(chunk) = self.chunks.peek() {
let lines = chunk.split('\n');
let chunk_lines = chunk.split('\n');
if self.reversed {
let mut lines = lines.rev().peekable();
while let Some(line) = lines.next() {
self.current_line.insert_str(0, line);
if lines.peek().is_some() {
let mut chunk_lines = chunk_lines.rev().peekable();
if let Some(chunk_line) = chunk_lines.next() {
let done = chunk_lines.peek().is_some();
if done {
self.chunks
.seek(self.chunks.offset() - line.len() - "\n".len());
.seek(self.chunks.offset() - chunk_line.len() - "\n".len());
if self.current_line.is_empty() {
return Some(chunk_line);
}
}
self.current_line.insert_str(0, chunk_line);
if done {
return Some(&self.current_line);
}
}
} else {
let mut lines = lines.peekable();
while let Some(line) = lines.next() {
self.current_line.push_str(line);
if lines.peek().is_some() {
let mut chunk_lines = chunk_lines.peekable();
if let Some(chunk_line) = chunk_lines.next() {
let done = chunk_lines.peek().is_some();
if done {
self.chunks
.seek(self.chunks.offset() + line.len() + "\n".len());
.seek(self.chunks.offset() + chunk_line.len() + "\n".len());
if self.current_line.is_empty() {
return Some(chunk_line);
}
}
self.current_line.push_str(chunk_line);
if done {
return Some(&self.current_line);
}
}
@@ -1573,6 +1585,20 @@ mod tests {
assert_eq!(lines.next(), Some("defg"));
assert_eq!(lines.next(), Some("abc"));
assert_eq!(lines.next(), None);
let rope = Rope::from("abc\nlonger line test\nhi");
let mut lines = rope.chunks().lines();
assert_eq!(lines.next(), Some("abc"));
assert_eq!(lines.next(), Some("longer line test"));
assert_eq!(lines.next(), Some("hi"));
assert_eq!(lines.next(), None);
let rope = Rope::from("abc\nlonger line test\nhi");
let mut lines = rope.reversed_chunks_in_range(0..rope.len()).lines();
assert_eq!(lines.next(), Some("hi"));
assert_eq!(lines.next(), Some("longer line test"));
assert_eq!(lines.next(), Some("abc"));
assert_eq!(lines.next(), None);
}
#[gpui::test(iterations = 100)]