From b5021411a84822cb3f1e3aeffad9550dd15bdeb6 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 16 Sep 2018 12:54:24 +0300 Subject: rename all things --- crates/ra_editor/src/line_index.rs | 62 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 crates/ra_editor/src/line_index.rs (limited to 'crates/ra_editor/src/line_index.rs') diff --git a/crates/ra_editor/src/line_index.rs b/crates/ra_editor/src/line_index.rs new file mode 100644 index 000000000..9cd8da3a8 --- /dev/null +++ b/crates/ra_editor/src/line_index.rs @@ -0,0 +1,62 @@ +use superslice::Ext; +use ::TextUnit; + +#[derive(Clone, Debug, Hash)] +pub struct LineIndex { + newlines: Vec, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub struct LineCol { + pub line: u32, + pub col: TextUnit, +} + +impl LineIndex { + pub fn new(text: &str) -> LineIndex { + let mut newlines = vec![0.into()]; + let mut curr = 0.into(); + for c in text.chars() { + curr += TextUnit::of_char(c); + if c == '\n' { + newlines.push(curr); + } + } + LineIndex { newlines } + } + + pub fn line_col(&self, offset: TextUnit) -> LineCol { + let line = self.newlines.upper_bound(&offset) - 1; + let line_start_offset = self.newlines[line]; + let col = offset - line_start_offset; + return LineCol { line: line as u32, col }; + } + + pub fn offset(&self, line_col: LineCol) -> TextUnit { + //TODO: return Result + self.newlines[line_col.line as usize] + line_col.col + } +} + +#[test] +fn test_line_index() { + let text = "hello\nworld"; + let index = LineIndex::new(text); + assert_eq!(index.line_col(0.into()), LineCol { line: 0, col: 0.into() }); + assert_eq!(index.line_col(1.into()), LineCol { line: 0, col: 1.into() }); + assert_eq!(index.line_col(5.into()), LineCol { line: 0, col: 5.into() }); + assert_eq!(index.line_col(6.into()), LineCol { line: 1, col: 0.into() }); + assert_eq!(index.line_col(7.into()), LineCol { line: 1, col: 1.into() }); + assert_eq!(index.line_col(8.into()), LineCol { line: 1, col: 2.into() }); + assert_eq!(index.line_col(10.into()), LineCol { line: 1, col: 4.into() }); + assert_eq!(index.line_col(11.into()), LineCol { line: 1, col: 5.into() }); + assert_eq!(index.line_col(12.into()), LineCol { line: 1, col: 6.into() }); + + let text = "\nhello\nworld"; + let index = LineIndex::new(text); + assert_eq!(index.line_col(0.into()), LineCol { line: 0, col: 0.into() }); + assert_eq!(index.line_col(1.into()), LineCol { line: 1, col: 0.into() }); + assert_eq!(index.line_col(2.into()), LineCol { line: 1, col: 1.into() }); + assert_eq!(index.line_col(6.into()), LineCol { line: 1, col: 5.into() }); + assert_eq!(index.line_col(7.into()), LineCol { line: 2, col: 0.into() }); +} -- cgit v1.2.3