From 26262aaf05983c5b7f41cc438e287523268fe1eb Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 10 Aug 2018 22:23:17 +0300 Subject: extend selection via LSP --- libeditor/src/lib.rs | 1 + libeditor/src/line_index.rs | 40 +++++++++++++++++++++++----------------- 2 files changed, 24 insertions(+), 17 deletions(-) (limited to 'libeditor/src') diff --git a/libeditor/src/lib.rs b/libeditor/src/lib.rs index 9da71743f..f77647338 100644 --- a/libeditor/src/lib.rs +++ b/libeditor/src/lib.rs @@ -10,6 +10,7 @@ use libsyntax2::{ SyntaxKind::*, }; pub use libsyntax2::{TextRange, TextUnit, ast}; +pub use self::line_index::{LineIndex, LineCol}; #[derive(Debug)] pub struct HighlightedRange { diff --git a/libeditor/src/line_index.rs b/libeditor/src/line_index.rs index feb482b32..801726aa5 100644 --- a/libeditor/src/line_index.rs +++ b/libeditor/src/line_index.rs @@ -1,6 +1,7 @@ use superslice::Ext; -use ::{TextUnit}; +use ::TextUnit; +#[derive(Clone, Debug)] pub struct LineIndex { newlines: Vec, } @@ -24,11 +25,16 @@ impl LineIndex { LineIndex { newlines } } - pub fn translate(&self, offset: TextUnit) -> LineCol { + 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 } + 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 } } @@ -36,21 +42,21 @@ impl LineIndex { fn test_line_index() { let text = "hello\nworld"; let index = LineIndex::new(text); - assert_eq!(index.translate(0.into()), LineCol { line: 0, col: 0.into()}); - assert_eq!(index.translate(1.into()), LineCol { line: 0, col: 1.into()}); - assert_eq!(index.translate(5.into()), LineCol { line: 0, col: 5.into()}); - assert_eq!(index.translate(6.into()), LineCol { line: 1, col: 0.into()}); - assert_eq!(index.translate(7.into()), LineCol { line: 1, col: 1.into()}); - assert_eq!(index.translate(8.into()), LineCol { line: 1, col: 2.into()}); - assert_eq!(index.translate(10.into()), LineCol { line: 1, col: 4.into()}); - assert_eq!(index.translate(11.into()), LineCol { line: 1, col: 5.into()}); - assert_eq!(index.translate(12.into()), LineCol { line: 1, col: 6.into()}); + 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.translate(0.into()), LineCol { line: 0, col: 0.into()}); - assert_eq!(index.translate(1.into()), LineCol { line: 1, col: 0.into()}); - assert_eq!(index.translate(2.into()), LineCol { line: 1, col: 1.into()}); - assert_eq!(index.translate(6.into()), LineCol { line: 1, col: 5.into()}); - assert_eq!(index.translate(7.into()), LineCol { line: 2, col: 0.into()}); + 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