commit
8330fb5f10
10 changed files with 1828 additions and 4 deletions
19
Cargo.lock
generated
19
Cargo.lock
generated
|
@ -3235,7 +3235,7 @@ dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"parking_lot 0.11.2",
|
"parking_lot 0.11.2",
|
||||||
"regex",
|
"regex",
|
||||||
"rope",
|
"rope2",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -7250,6 +7250,20 @@ dependencies = [
|
||||||
"util",
|
"util",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rope2"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"arrayvec 0.7.4",
|
||||||
|
"bromberg_sl2",
|
||||||
|
"gpui2",
|
||||||
|
"log",
|
||||||
|
"rand 0.8.5",
|
||||||
|
"smallvec",
|
||||||
|
"sum_tree",
|
||||||
|
"util",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "roxmltree"
|
name = "roxmltree"
|
||||||
version = "0.14.1"
|
version = "0.14.1"
|
||||||
|
@ -9062,7 +9076,7 @@ dependencies = [
|
||||||
"postage",
|
"postage",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"regex",
|
"regex",
|
||||||
"rope",
|
"rope2",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"sum_tree",
|
"sum_tree",
|
||||||
"util",
|
"util",
|
||||||
|
@ -11359,6 +11373,7 @@ dependencies = [
|
||||||
"project2",
|
"project2",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"regex",
|
"regex",
|
||||||
|
"rope2",
|
||||||
"rpc2",
|
"rpc2",
|
||||||
"rsa 0.4.0",
|
"rsa 0.4.0",
|
||||||
"rust-embed",
|
"rust-embed",
|
||||||
|
|
|
@ -9,7 +9,7 @@ path = "src/fs2.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
collections = { path = "../collections" }
|
collections = { path = "../collections" }
|
||||||
rope = { path = "../rope" }
|
rope = { package = "rope2", path = "../rope2" }
|
||||||
text = { package = "text2", path = "../text2" }
|
text = { package = "text2", path = "../text2" }
|
||||||
util = { path = "../util" }
|
util = { path = "../util" }
|
||||||
sum_tree = { path = "../sum_tree" }
|
sum_tree = { path = "../sum_tree" }
|
||||||
|
|
21
crates/rope2/Cargo.toml
Normal file
21
crates/rope2/Cargo.toml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
[package]
|
||||||
|
name = "rope2"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
path = "src/rope2.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bromberg_sl2 = { git = "https://github.com/zed-industries/bromberg_sl2", rev = "950bc5482c216c395049ae33ae4501e08975f17f" }
|
||||||
|
smallvec.workspace = true
|
||||||
|
sum_tree = { path = "../sum_tree" }
|
||||||
|
arrayvec = "0.7.1"
|
||||||
|
log.workspace = true
|
||||||
|
util = { path = "../util" }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
rand.workspace = true
|
||||||
|
util = { path = "../util", features = ["test-support"] }
|
||||||
|
gpui = { package = "gpui2", path = "../gpui2", features = ["test-support"] }
|
50
crates/rope2/src/offset_utf16.rs
Normal file
50
crates/rope2/src/offset_utf16.rs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
use std::ops::{Add, AddAssign, Sub};
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd)]
|
||||||
|
pub struct OffsetUtf16(pub usize);
|
||||||
|
|
||||||
|
impl<'a> Add<&'a Self> for OffsetUtf16 {
|
||||||
|
type Output = Self;
|
||||||
|
|
||||||
|
fn add(self, other: &'a Self) -> Self::Output {
|
||||||
|
Self(self.0 + other.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Add for OffsetUtf16 {
|
||||||
|
type Output = Self;
|
||||||
|
|
||||||
|
fn add(self, other: Self) -> Self::Output {
|
||||||
|
Self(self.0 + other.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Sub<&'a Self> for OffsetUtf16 {
|
||||||
|
type Output = Self;
|
||||||
|
|
||||||
|
fn sub(self, other: &'a Self) -> Self::Output {
|
||||||
|
debug_assert!(*other <= self);
|
||||||
|
Self(self.0 - other.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sub for OffsetUtf16 {
|
||||||
|
type Output = OffsetUtf16;
|
||||||
|
|
||||||
|
fn sub(self, other: Self) -> Self::Output {
|
||||||
|
debug_assert!(other <= self);
|
||||||
|
Self(self.0 - other.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> AddAssign<&'a Self> for OffsetUtf16 {
|
||||||
|
fn add_assign(&mut self, other: &'a Self) {
|
||||||
|
self.0 += other.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddAssign<Self> for OffsetUtf16 {
|
||||||
|
fn add_assign(&mut self, other: Self) {
|
||||||
|
self.0 += other.0;
|
||||||
|
}
|
||||||
|
}
|
128
crates/rope2/src/point.rs
Normal file
128
crates/rope2/src/point.rs
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
use std::{
|
||||||
|
cmp::Ordering,
|
||||||
|
ops::{Add, AddAssign, Sub},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Default, Eq, PartialEq, Debug, Hash)]
|
||||||
|
pub struct Point {
|
||||||
|
pub row: u32,
|
||||||
|
pub column: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Point {
|
||||||
|
pub const MAX: Self = Self {
|
||||||
|
row: u32::MAX,
|
||||||
|
column: u32::MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn new(row: u32, column: u32) -> Self {
|
||||||
|
Point { row, column }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn zero() -> Self {
|
||||||
|
Point::new(0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn parse_str(s: &str) -> Self {
|
||||||
|
let mut point = Self::zero();
|
||||||
|
for (row, line) in s.split('\n').enumerate() {
|
||||||
|
point.row = row as u32;
|
||||||
|
point.column = line.len() as u32;
|
||||||
|
}
|
||||||
|
point
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_zero(&self) -> bool {
|
||||||
|
self.row == 0 && self.column == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn saturating_sub(self, other: Self) -> Self {
|
||||||
|
if self < other {
|
||||||
|
Self::zero()
|
||||||
|
} else {
|
||||||
|
self - other
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Add<&'a Self> for Point {
|
||||||
|
type Output = Point;
|
||||||
|
|
||||||
|
fn add(self, other: &'a Self) -> Self::Output {
|
||||||
|
self + *other
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Add for Point {
|
||||||
|
type Output = Point;
|
||||||
|
|
||||||
|
fn add(self, other: Self) -> Self::Output {
|
||||||
|
if other.row == 0 {
|
||||||
|
Point::new(self.row, self.column + other.column)
|
||||||
|
} else {
|
||||||
|
Point::new(self.row + other.row, other.column)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Sub<&'a Self> for Point {
|
||||||
|
type Output = Point;
|
||||||
|
|
||||||
|
fn sub(self, other: &'a Self) -> Self::Output {
|
||||||
|
self - *other
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sub for Point {
|
||||||
|
type Output = Point;
|
||||||
|
|
||||||
|
fn sub(self, other: Self) -> Self::Output {
|
||||||
|
debug_assert!(other <= self);
|
||||||
|
|
||||||
|
if self.row == other.row {
|
||||||
|
Point::new(0, self.column - other.column)
|
||||||
|
} else {
|
||||||
|
Point::new(self.row - other.row, self.column)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> AddAssign<&'a Self> for Point {
|
||||||
|
fn add_assign(&mut self, other: &'a Self) {
|
||||||
|
*self += *other;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddAssign<Self> for Point {
|
||||||
|
fn add_assign(&mut self, other: Self) {
|
||||||
|
if other.row == 0 {
|
||||||
|
self.column += other.column;
|
||||||
|
} else {
|
||||||
|
self.row += other.row;
|
||||||
|
self.column = other.column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialOrd for Point {
|
||||||
|
fn partial_cmp(&self, other: &Point) -> Option<Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for Point {
|
||||||
|
#[cfg(target_pointer_width = "64")]
|
||||||
|
fn cmp(&self, other: &Point) -> Ordering {
|
||||||
|
let a = (self.row as usize) << 32 | self.column as usize;
|
||||||
|
let b = (other.row as usize) << 32 | other.column as usize;
|
||||||
|
a.cmp(&b)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_pointer_width = "32")]
|
||||||
|
fn cmp(&self, other: &Point) -> Ordering {
|
||||||
|
match self.row.cmp(&other.row) {
|
||||||
|
Ordering::Equal => self.column.cmp(&other.column),
|
||||||
|
comparison @ _ => comparison,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
119
crates/rope2/src/point_utf16.rs
Normal file
119
crates/rope2/src/point_utf16.rs
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
use std::{
|
||||||
|
cmp::Ordering,
|
||||||
|
ops::{Add, AddAssign, Sub},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Default, Eq, PartialEq, Debug, Hash)]
|
||||||
|
pub struct PointUtf16 {
|
||||||
|
pub row: u32,
|
||||||
|
pub column: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PointUtf16 {
|
||||||
|
pub const MAX: Self = Self {
|
||||||
|
row: u32::MAX,
|
||||||
|
column: u32::MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn new(row: u32, column: u32) -> Self {
|
||||||
|
PointUtf16 { row, column }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn zero() -> Self {
|
||||||
|
PointUtf16::new(0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_zero(&self) -> bool {
|
||||||
|
self.row == 0 && self.column == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn saturating_sub(self, other: Self) -> Self {
|
||||||
|
if self < other {
|
||||||
|
Self::zero()
|
||||||
|
} else {
|
||||||
|
self - other
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Add<&'a Self> for PointUtf16 {
|
||||||
|
type Output = PointUtf16;
|
||||||
|
|
||||||
|
fn add(self, other: &'a Self) -> Self::Output {
|
||||||
|
self + *other
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Add for PointUtf16 {
|
||||||
|
type Output = PointUtf16;
|
||||||
|
|
||||||
|
fn add(self, other: Self) -> Self::Output {
|
||||||
|
if other.row == 0 {
|
||||||
|
PointUtf16::new(self.row, self.column + other.column)
|
||||||
|
} else {
|
||||||
|
PointUtf16::new(self.row + other.row, other.column)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Sub<&'a Self> for PointUtf16 {
|
||||||
|
type Output = PointUtf16;
|
||||||
|
|
||||||
|
fn sub(self, other: &'a Self) -> Self::Output {
|
||||||
|
self - *other
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sub for PointUtf16 {
|
||||||
|
type Output = PointUtf16;
|
||||||
|
|
||||||
|
fn sub(self, other: Self) -> Self::Output {
|
||||||
|
debug_assert!(other <= self);
|
||||||
|
|
||||||
|
if self.row == other.row {
|
||||||
|
PointUtf16::new(0, self.column - other.column)
|
||||||
|
} else {
|
||||||
|
PointUtf16::new(self.row - other.row, self.column)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> AddAssign<&'a Self> for PointUtf16 {
|
||||||
|
fn add_assign(&mut self, other: &'a Self) {
|
||||||
|
*self += *other;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddAssign<Self> for PointUtf16 {
|
||||||
|
fn add_assign(&mut self, other: Self) {
|
||||||
|
if other.row == 0 {
|
||||||
|
self.column += other.column;
|
||||||
|
} else {
|
||||||
|
self.row += other.row;
|
||||||
|
self.column = other.column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialOrd for PointUtf16 {
|
||||||
|
fn partial_cmp(&self, other: &PointUtf16) -> Option<Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for PointUtf16 {
|
||||||
|
#[cfg(target_pointer_width = "64")]
|
||||||
|
fn cmp(&self, other: &PointUtf16) -> Ordering {
|
||||||
|
let a = (self.row as usize) << 32 | self.column as usize;
|
||||||
|
let b = (other.row as usize) << 32 | other.column as usize;
|
||||||
|
a.cmp(&b)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_pointer_width = "32")]
|
||||||
|
fn cmp(&self, other: &PointUtf16) -> Ordering {
|
||||||
|
match self.row.cmp(&other.row) {
|
||||||
|
Ordering::Equal => self.column.cmp(&other.column),
|
||||||
|
comparison @ _ => comparison,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1433
crates/rope2/src/rope2.rs
Normal file
1433
crates/rope2/src/rope2.rs
Normal file
File diff suppressed because it is too large
Load diff
57
crates/rope2/src/unclipped.rs
Normal file
57
crates/rope2/src/unclipped.rs
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
use crate::{ChunkSummary, TextDimension, TextSummary};
|
||||||
|
use std::ops::{Add, AddAssign, Sub, SubAssign};
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
|
pub struct Unclipped<T>(pub T);
|
||||||
|
|
||||||
|
impl<T> From<T> for Unclipped<T> {
|
||||||
|
fn from(value: T) -> Self {
|
||||||
|
Unclipped(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, T: sum_tree::Dimension<'a, ChunkSummary>> sum_tree::Dimension<'a, ChunkSummary>
|
||||||
|
for Unclipped<T>
|
||||||
|
{
|
||||||
|
fn add_summary(&mut self, summary: &'a ChunkSummary, _: &()) {
|
||||||
|
self.0.add_summary(summary, &());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: TextDimension> TextDimension for Unclipped<T> {
|
||||||
|
fn from_text_summary(summary: &TextSummary) -> Self {
|
||||||
|
Unclipped(T::from_text_summary(summary))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_assign(&mut self, other: &Self) {
|
||||||
|
TextDimension::add_assign(&mut self.0, &other.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Add<T, Output = T>> Add<Unclipped<T>> for Unclipped<T> {
|
||||||
|
type Output = Unclipped<T>;
|
||||||
|
|
||||||
|
fn add(self, rhs: Unclipped<T>) -> Self::Output {
|
||||||
|
Unclipped(self.0 + rhs.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Sub<T, Output = T>> Sub<Unclipped<T>> for Unclipped<T> {
|
||||||
|
type Output = Unclipped<T>;
|
||||||
|
|
||||||
|
fn sub(self, rhs: Unclipped<T>) -> Self::Output {
|
||||||
|
Unclipped(self.0 - rhs.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: AddAssign<T>> AddAssign<Unclipped<T>> for Unclipped<T> {
|
||||||
|
fn add_assign(&mut self, rhs: Unclipped<T>) {
|
||||||
|
self.0 += rhs.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: SubAssign<T>> SubAssign<Unclipped<T>> for Unclipped<T> {
|
||||||
|
fn sub_assign(&mut self, rhs: Unclipped<T>) {
|
||||||
|
self.0 -= rhs.0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,7 +14,7 @@ test-support = ["rand"]
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clock = { path = "../clock" }
|
clock = { path = "../clock" }
|
||||||
collections = { path = "../collections" }
|
collections = { path = "../collections" }
|
||||||
rope = { path = "../rope" }
|
rope = { package = "rope2", path = "../rope2" }
|
||||||
sum_tree = { path = "../sum_tree" }
|
sum_tree = { path = "../sum_tree" }
|
||||||
util = { path = "../util" }
|
util = { path = "../util" }
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,7 @@ project = { package = "project2", path = "../project2" }
|
||||||
# project_symbols = { path = "../project_symbols" }
|
# project_symbols = { path = "../project_symbols" }
|
||||||
# quick_action_bar = { path = "../quick_action_bar" }
|
# quick_action_bar = { path = "../quick_action_bar" }
|
||||||
# recent_projects = { path = "../recent_projects" }
|
# recent_projects = { path = "../recent_projects" }
|
||||||
|
rope = { package = "rope2", path = "../rope2"}
|
||||||
rpc = { package = "rpc2", path = "../rpc2" }
|
rpc = { package = "rpc2", path = "../rpc2" }
|
||||||
settings = { package = "settings2", path = "../settings2" }
|
settings = { package = "settings2", path = "../settings2" }
|
||||||
feature_flags = { package = "feature_flags2", path = "../feature_flags2" }
|
feature_flags = { package = "feature_flags2", path = "../feature_flags2" }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue