Skip to content

Commit

Permalink
line-index method to allow clamping column to line length
Browse files Browse the repository at this point in the history
Part of #18240
  • Loading branch information
krobelus committed Oct 15, 2024
1 parent 0319586 commit cf0c848
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lib/line-index/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
10 changes: 9 additions & 1 deletion lib/line-index/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,10 +177,18 @@ 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).
pub fn lines(&self, range: TextRange) -> impl Iterator<Item = TextRange> + '_ {
pub fn lines_in_range(&self, range: TextRange) -> impl Iterator<Item = TextRange> + '_ {
let lo = self.newlines.partition_point(|&it| it < range.start());
let hi = self.newlines.partition_point(|&it| it <= range.end());
let all = std::iter::once(range.start())
Expand Down
23 changes: 23 additions & 0 deletions lib/line-index/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

0 comments on commit cf0c848

Please sign in to comment.