mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 04:53:34 +00:00
Replace superslice with API on path to stabilization
This commit is contained in:
parent
085891d885
commit
4f7a3fba59
5 changed files with 37 additions and 13 deletions
8
Cargo.lock
generated
8
Cargo.lock
generated
|
@ -1077,7 +1077,7 @@ dependencies = [
|
|||
"ra_text_edit",
|
||||
"rayon",
|
||||
"rustc-hash",
|
||||
"superslice",
|
||||
"stdx",
|
||||
"test_utils",
|
||||
]
|
||||
|
||||
|
@ -1583,12 +1583,6 @@ dependencies = [
|
|||
name = "stdx"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "superslice"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ab16ced94dbd8a46c82fd81e3ed9a8727dac2977ea869d217bcc4ea1f122e81f"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.35"
|
||||
|
|
|
@ -16,10 +16,11 @@ log = "0.4.8"
|
|||
rayon = "1.3.0"
|
||||
fst = { version = "0.4", default-features = false }
|
||||
rustc-hash = "1.1.0"
|
||||
superslice = "1.0.0"
|
||||
once_cell = "1.3.1"
|
||||
either = "1.5.3"
|
||||
|
||||
stdx = { path = "../stdx" }
|
||||
|
||||
ra_syntax = { path = "../ra_syntax" }
|
||||
ra_text_edit = { path = "../ra_text_edit" }
|
||||
ra_db = { path = "../ra_db" }
|
||||
|
|
|
@ -4,7 +4,7 @@ use std::iter;
|
|||
|
||||
use ra_syntax::{TextRange, TextSize};
|
||||
use rustc_hash::FxHashMap;
|
||||
use superslice::Ext;
|
||||
use stdx::partition_point;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub struct LineIndex {
|
||||
|
@ -89,7 +89,7 @@ impl LineIndex {
|
|||
}
|
||||
|
||||
pub fn line_col(&self, offset: TextSize) -> LineCol {
|
||||
let line = self.newlines.upper_bound(&offset) - 1;
|
||||
let line = partition_point(&self.newlines, |&it| it <= offset) - 1;
|
||||
let line_start_offset = self.newlines[line];
|
||||
let col = offset - line_start_offset;
|
||||
|
||||
|
@ -103,8 +103,8 @@ impl LineIndex {
|
|||
}
|
||||
|
||||
pub fn lines(&self, range: TextRange) -> impl Iterator<Item = TextRange> + '_ {
|
||||
let lo = self.newlines.lower_bound(&range.start());
|
||||
let hi = self.newlines.upper_bound(&range.end());
|
||||
let lo = partition_point(&self.newlines, |&it| it < range.start());
|
||||
let hi = partition_point(&self.newlines, |&it| it <= range.end());
|
||||
let all = iter::once(range.start())
|
||||
.chain(self.newlines[lo..hi].iter().copied())
|
||||
.chain(iter::once(range.end()));
|
||||
|
|
|
@ -158,6 +158,36 @@ impl<'a> Iterator for LinesWithEnds<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
// https://github.com/rust-lang/rust/issues/73831
|
||||
pub fn partition_point<T, P>(slice: &[T], mut pred: P) -> usize
|
||||
where
|
||||
P: FnMut(&T) -> bool,
|
||||
{
|
||||
let mut left = 0;
|
||||
let mut right = slice.len();
|
||||
|
||||
while left != right {
|
||||
let mid = left + (right - left) / 2;
|
||||
// SAFETY:
|
||||
// When left < right, left <= mid < right.
|
||||
// Therefore left always increases and right always decreases,
|
||||
// and either of them is selected.
|
||||
// In both cases left <= right is satisfied.
|
||||
// Therefore if left < right in a step,
|
||||
// left <= right is satisfied in the next step.
|
||||
// Therefore as long as left != right, 0 <= left < right <= len is satisfied
|
||||
// and if this case 0 <= mid < len is satisfied too.
|
||||
let value = unsafe { slice.get_unchecked(mid) };
|
||||
if pred(value) {
|
||||
left = mid + 1;
|
||||
} else {
|
||||
right = mid;
|
||||
}
|
||||
}
|
||||
|
||||
left
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
|
|
@ -53,7 +53,6 @@ fn rust_files_are_tidy() {
|
|||
fn check_licenses() {
|
||||
let expected = "
|
||||
0BSD OR MIT OR Apache-2.0
|
||||
Apache-2.0
|
||||
Apache-2.0 OR BSL-1.0
|
||||
Apache-2.0 OR MIT
|
||||
Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT
|
||||
|
|
Loading…
Reference in a new issue