Don't panic rope point conversions

This commit is contained in:
Julia 2022-11-30 00:01:40 -05:00
parent 5965113fc8
commit 2b979d3b88

View file

@ -681,8 +681,8 @@ impl Chunk {
let mut offset = 0; let mut offset = 0;
let mut point = Point::new(0, 0); let mut point = Point::new(0, 0);
for ch in self.0.chars() { for ch in self.0.chars() {
verify_not!(point > target, ("point {:?} is inside of character {:?}", target, ch), else { verify_not!(point > target, ("point {target:?} is inside of character {ch:?}"), else {
point = target; return offset;
}); });
if point == target { if point == target {
@ -691,16 +691,19 @@ impl Chunk {
if ch == '\n' { if ch == '\n' {
point.row += 1; point.row += 1;
if point.row > target.row {
panic!(
"point {:?} is beyond the end of a line with length {}",
target, point.column
);
}
point.column = 0; point.column = 0;
verify_not!(
point.row > target.row,
("point {target:?} is beyond the end of a line with length {}", point.column),
else {
return offset;
}
);
} else { } else {
point.column += ch.len_utf8() as u32; point.column += ch.len_utf8() as u32;
} }
offset += ch.len_utf8(); offset += ch.len_utf8();
} }
offset offset
@ -739,26 +742,36 @@ impl Chunk {
if ch == '\n' { if ch == '\n' {
point.row += 1; point.row += 1;
point.column = 0; point.column = 0;
if point.row > target.row {
if clip { if clip {
if point.row > target.row {
// Return the offset of the newline // Return the offset of the newline
return offset; return offset;
} }
panic!( } else {
"point {:?} is beyond the end of a line with length {}", verify_not!(
target, point.column point.row > target.row,
); ("point {target:?} is beyond the end of a line with length {}", point.column),
else {
// Return the offset of the newline
return offset;
}
)
} }
} else { } else {
point.column += ch.len_utf16() as u32; point.column += ch.len_utf16() as u32;
} }
if point > target { if clip {
if clip { if point > target {
// Return the offset of the codepoint which we have landed within, bias left // Return the offset of the codepoint which we have landed within, bias left
return offset; return offset;
} }
panic!("point {:?} is inside of codepoint {:?}", target, ch); } else {
verify_not!(point > target, ("point {target:?} is inside of codepoint {ch:?}"), else {
// Return the offset of the codepoint which we have landed within, bias left
return offset;
});
} }
offset += ch.len_utf8(); offset += ch.len_utf8();