From e29a58995b36760c7f8d50338d1e100c2360217d Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 15 May 2019 19:07:49 +0300 Subject: :arrow_up: text_unit --- crates/ra_syntax/Cargo.toml | 2 +- crates/ra_syntax/src/syntax_text.rs | 65 +++++++++++++++---------------------- 2 files changed, 27 insertions(+), 40 deletions(-) (limited to 'crates') diff --git a/crates/ra_syntax/Cargo.toml b/crates/ra_syntax/Cargo.toml index 1f3981f5a..2e521183c 100644 --- a/crates/ra_syntax/Cargo.toml +++ b/crates/ra_syntax/Cargo.toml @@ -17,7 +17,7 @@ rowan = "0.5.0" # ideally, `serde` should be enabled by `ra_lsp_server`, but we enable it here # to reduce number of compilations -text_unit = { version = "0.1.6", features = ["serde"] } +text_unit = { version = "0.1.8", features = ["serde"] } smol_str = { version = "0.1.9", features = ["serde"] } ra_text_edit = { path = "../ra_text_edit" } diff --git a/crates/ra_syntax/src/syntax_text.rs b/crates/ra_syntax/src/syntax_text.rs index 6bb2ff461..b013164c4 100644 --- a/crates/ra_syntax/src/syntax_text.rs +++ b/crates/ra_syntax/src/syntax_text.rs @@ -1,4 +1,4 @@ -use std::{fmt, ops}; +use std::{fmt, ops::{self, Bound}}; use crate::{SyntaxNode, TextRange, TextUnit, SyntaxElement}; @@ -54,10 +54,31 @@ impl<'a> SyntaxText<'a> { self.range.len() } - pub fn slice(&self, range: impl SyntaxTextSlice) -> SyntaxText<'a> { - let range = range.restrict(self.range).unwrap_or_else(|| { - panic!("invalid slice, range: {:?}, slice: {:?}", self.range, range) - }); + /// NB, the offsets here are absolute, and this probably doesn't make sense! + pub fn slice(&self, range: impl ops::RangeBounds) -> SyntaxText<'a> { + let start = match range.start_bound() { + Bound::Included(b) => *b, + Bound::Excluded(b) => *b + TextUnit::from(1u32), + Bound::Unbounded => self.range.start(), + }; + let end = match range.end_bound() { + Bound::Included(b) => *b + TextUnit::from(1u32), + Bound::Excluded(b) => *b, + Bound::Unbounded => self.range.end(), + }; + assert!( + start <= end, + "invalid slice, range: {:?}, slice: {:?}", + self.range, + (range.start_bound(), range.end_bound()), + ); + let range = TextRange::from_to(start, end); + assert!( + range.is_subrange(&self.range), + "invalid slice, range: {:?}, slice: {:?}", + self.range, + range, + ); SyntaxText { node: self.node, range } } @@ -88,40 +109,6 @@ impl<'a> fmt::Display for SyntaxText<'a> { } } -pub trait SyntaxTextSlice: fmt::Debug { - fn restrict(&self, range: TextRange) -> Option; -} - -impl SyntaxTextSlice for TextRange { - fn restrict(&self, range: TextRange) -> Option { - self.intersection(&range) - } -} - -impl SyntaxTextSlice for ops::RangeTo { - fn restrict(&self, range: TextRange) -> Option { - if !range.contains_inclusive(self.end) { - return None; - } - Some(TextRange::from_to(range.start(), self.end)) - } -} - -impl SyntaxTextSlice for ops::RangeFrom { - fn restrict(&self, range: TextRange) -> Option { - if !range.contains_inclusive(self.start) { - return None; - } - Some(TextRange::from_to(self.start, range.end())) - } -} - -impl SyntaxTextSlice for ops::Range { - fn restrict(&self, range: TextRange) -> Option { - TextRange::from_to(self.start, self.end).restrict(range) - } -} - impl From> for String { fn from(text: SyntaxText) -> String { text.to_string() -- cgit v1.2.3