input: Update RopeExt to use LF style for get correct line when have \r. (#1296)
This commit is contained in:
parent
328da4da21
commit
4983300ddf
3 changed files with 20 additions and 9 deletions
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
|
@ -27,6 +27,8 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
with:
|
||||
components: clippy
|
||||
- name: Install system dependencies
|
||||
if: ${{ matrix.run_on != 'windows-latest' }}
|
||||
run: script/bootstrap
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ gpui-component = { path = "crates/ui" }
|
|||
gpui-component-macros = { path = "crates/macros" }
|
||||
story = { path = "crates/story" }
|
||||
wef = { path = "crates/wef" }
|
||||
ropey = { version = "=2.0.0-beta.1", features = ["metric_utf16"] }
|
||||
ropey = { version = "=2.0.0-beta.1", features = ["metric_utf16", "metric_lines_lf"] }
|
||||
|
||||
anyhow = "1"
|
||||
log = "0.4"
|
||||
|
|
|
|||
|
|
@ -226,7 +226,7 @@ impl RopeExt for Rope {
|
|||
return self.slice(0..0);
|
||||
}
|
||||
|
||||
let line = self.line(row, LineType::LF_CR);
|
||||
let line = self.line(row, LineType::LF);
|
||||
if line.len() > 0 {
|
||||
let line_end = line.len() - 1;
|
||||
if line.is_char_boundary(line_end) && line.char(line_end) == '\n' {
|
||||
|
|
@ -257,8 +257,8 @@ impl RopeExt for Rope {
|
|||
|
||||
fn offset_to_point(&self, offset: usize) -> Point {
|
||||
let offset = self.clip_offset(offset, Bias::Left);
|
||||
let row = self.byte_to_line_idx(offset, LineType::LF_CR);
|
||||
let line_start = self.line_to_byte_idx(row, LineType::LF_CR);
|
||||
let row = self.byte_to_line_idx(offset, LineType::LF);
|
||||
let line_start = self.line_to_byte_idx(row, LineType::LF);
|
||||
let column = offset.saturating_sub(line_start);
|
||||
Point::new(row, column)
|
||||
}
|
||||
|
|
@ -268,7 +268,7 @@ impl RopeExt for Rope {
|
|||
return self.len();
|
||||
}
|
||||
|
||||
let line_start = self.line_to_byte_idx(point.row, LineType::LF_CR);
|
||||
let line_start = self.line_to_byte_idx(point.row, LineType::LF);
|
||||
line_start + point.column
|
||||
}
|
||||
|
||||
|
|
@ -299,7 +299,7 @@ impl RopeExt for Rope {
|
|||
}
|
||||
|
||||
fn lines_len(&self) -> usize {
|
||||
self.len_lines(LineType::LF_CR)
|
||||
self.len_lines(LineType::LF)
|
||||
}
|
||||
|
||||
fn char_at(&self, offset: usize) -> Option<char> {
|
||||
|
|
@ -399,7 +399,7 @@ mod tests {
|
|||
use crate::input::{Position, RopeExt};
|
||||
|
||||
#[test]
|
||||
fn test_line() {
|
||||
fn test_slice_line() {
|
||||
let rope = Rope::from("Hello\nWorld\r\nThis is a test 中文\nRope");
|
||||
assert_eq!(rope.slice_line(0).to_string(), "Hello");
|
||||
assert_eq!(rope.slice_line(1).to_string(), "World\r");
|
||||
|
|
@ -408,6 +408,11 @@ mod tests {
|
|||
|
||||
// over bounds
|
||||
assert_eq!(rope.slice_line(6).to_string(), "");
|
||||
|
||||
// only have \r end
|
||||
let rope = Rope::from("Hello\r");
|
||||
assert_eq!(rope.slice_line(0).to_string(), "Hello\r");
|
||||
assert_eq!(rope.slice_line(1).to_string(), "");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -418,15 +423,19 @@ mod tests {
|
|||
assert_eq!(rope.lines_len(), 1);
|
||||
let rope = Rope::from("Single line");
|
||||
assert_eq!(rope.lines_len(), 1);
|
||||
|
||||
// only have \r end
|
||||
let rope = Rope::from("Hello\r");
|
||||
assert_eq!(rope.lines_len(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_lines() {
|
||||
let rope = Rope::from("Hello\nWorld\r\nThis is a test 中文\nRope");
|
||||
let rope = Rope::from("Hello\nWorld\r\nThis is a test 中文\nRope\r");
|
||||
let lines: Vec<_> = rope.iter_lines().map(|r| r.to_string()).collect();
|
||||
assert_eq!(
|
||||
lines,
|
||||
vec!["Hello", "World\r", "This is a test 中文", "Rope"]
|
||||
vec!["Hello", "World\r", "This is a test 中文", "Rope\r"]
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue