diff --git a/crates/language/src/excerpt_list.rs b/crates/language/src/excerpt_list.rs index 42cfef848c38d8f5cb591c8d3fd7ec52a0d5f9b8..b00f1edbc1edab535714d6b1b82179d4aa9cb162 100644 --- a/crates/language/src/excerpt_list.rs +++ b/crates/language/src/excerpt_list.rs @@ -356,54 +356,53 @@ impl<'a> Iterator for Chunks<'a> { type Item = Chunk<'a>; fn next(&mut self) -> Option { - if self.header_height > 0 { - let chunk = Chunk { - text: unsafe { - std::str::from_utf8_unchecked(&NEWLINES[..self.header_height as usize]) - }, - ..Default::default() - }; - self.header_height = 0; - return Some(chunk); - } - - if let Some(entry_chunks) = self.entry_chunks.as_mut() { - if let Some(chunk) = entry_chunks.next() { - return Some(chunk); - } else if self.range.end >= self.cursor.end(&()) { - self.entry_chunks.take(); - return Some(Chunk { - text: "\n", + loop { + if self.header_height > 0 { + let chunk = Chunk { + text: unsafe { + std::str::from_utf8_unchecked(&NEWLINES[..self.header_height as usize]) + }, ..Default::default() - }); - } else { - return None; + }; + self.header_height = 0; + return Some(chunk); } - } - self.cursor.next(&()); - if *self.cursor.start() == self.range.end { - return None; - } + if let Some(entry_chunks) = self.entry_chunks.as_mut() { + if let Some(chunk) = entry_chunks.next() { + return Some(chunk); + } + self.entry_chunks.take(); + if self.cursor.end(&()) <= self.range.end { + return Some(Chunk { + text: "\n", + ..Default::default() + }); + } + } - let excerpt = self.cursor.item()?; - let buffer_range = excerpt.range.to_offset(&excerpt.buffer); + self.cursor.next(&()); + if *self.cursor.start() >= self.range.end { + return None; + } - let buffer_end = cmp::min( - buffer_range.end, - buffer_range.start + self.range.end - - excerpt.header_height as usize - - self.cursor.start(), - ); + let excerpt = self.cursor.item()?; + let buffer_range = excerpt.range.to_offset(&excerpt.buffer); - self.header_height = excerpt.header_height; - self.entry_chunks = Some( - excerpt - .buffer - .chunks(buffer_range.start..buffer_end, self.theme), - ); + let buffer_end = cmp::min( + buffer_range.end, + buffer_range.start + self.range.end + - excerpt.header_height as usize + - self.cursor.start(), + ); - self.next() + self.header_height = excerpt.header_height; + self.entry_chunks = Some( + excerpt + .buffer + .chunks(buffer_range.start..buffer_end, self.theme), + ); + } } }