Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--lib/line-index/Cargo.toml2
-rw-r--r--lib/line-index/src/lib.rs8
-rw-r--r--lib/line-index/src/tests.rs23
3 files changed, 32 insertions, 1 deletions
diff --git a/lib/line-index/Cargo.toml b/lib/line-index/Cargo.toml
index 8ae4954dd0..14196ba3d0 100644
--- a/lib/line-index/Cargo.toml
+++ b/lib/line-index/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "line-index"
-version = "0.1.1"
+version = "0.1.2"
description = "Maps flat `TextSize` offsets to/from `(line, column)` representation."
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-lang/rust-analyzer/tree/master/lib/line-index"
diff --git a/lib/line-index/src/lib.rs b/lib/line-index/src/lib.rs
index 66875e2524..6f0455ee98 100644
--- a/lib/line-index/src/lib.rs
+++ b/lib/line-index/src/lib.rs
@@ -177,6 +177,14 @@ impl LineIndex {
Some(LineCol { line: line_col.line, col })
}
+ /// Returns the given line's range.
+ pub fn line(&self, line: u32) -> Option<TextRange> {
+ let start = self.start_offset(line as usize)?;
+ let next_newline = self.newlines.get(line as usize).copied().unwrap_or(self.len);
+ let line_length = next_newline - start;
+ Some(TextRange::new(start, start + line_length))
+ }
+
/// Given a range [start, end), returns a sorted iterator of non-empty ranges [start, x1), [x1,
/// x2), ..., [xn, end) where all the xi, which are positions of newlines, are inside the range
/// [start, end).
diff --git a/lib/line-index/src/tests.rs b/lib/line-index/src/tests.rs
index 57fad1dfc0..f2bb04aec3 100644
--- a/lib/line-index/src/tests.rs
+++ b/lib/line-index/src/tests.rs
@@ -195,3 +195,26 @@ fn test_every_chars() {
}
}
}
+
+#[test]
+fn test_line() {
+ use text_size::TextRange;
+
+ macro_rules! validate {
+ ($text:expr, $line:expr, $expected_start:literal .. $expected_end:literal) => {
+ let line_index = LineIndex::new($text);
+ assert_eq!(
+ line_index.line($line),
+ Some(TextRange::new(
+ TextSize::from($expected_start),
+ TextSize::from($expected_end)
+ ))
+ );
+ };
+ }
+
+ validate!("", 0, 0..0);
+ validate!("\n", 1, 1..1);
+ validate!("\nabc", 1, 1..4);
+ validate!("\nabc\ndef", 1, 1..5);
+}