on master help sign in
Cleanup
commit64afd546544b112466e35ef52c492aa604ef7f39 authorJason Rodney Hansen <jasonrodneyhansen@gmail.com> dateThu 18 Nov 2021, 12:27 (5 years ago) parentcc04fab
1 file changed+85−42
helix-core/src/date.rs+85−42
helix-core/src/date.rs+85−42
@@ -45,8 +45,21 @@ pub struct DateIncrementor {
4545
4646impl DateIncrementor {
4747 pub fn from_range(text: RopeSlice, range: Range) -> Option<DateIncrementor> {
48+ let range = if range.is_empty() {
49+ if range.anchor < text.len_bytes() {
50+ // Treat empty range as a cursor range.
51+ range.put_cursor(text, range.anchor + 1, true)
52+ } else {
53+ // The range is empty and at the end of the text.
54+ return None;
55+ }
56+ } else {
57+ range
58+ };
59+
4860 let from = range.from().saturating_sub(DATE_LENGTH);
4961 let to = (range.from() + DATE_LENGTH).min(text.len_chars());
62+
5063 let (from_in_text, to_in_text) = (range.from() - from, range.to() - from);
5164 let text: Cow<str> = text.slice(from..to).into();
5265
@@ -58,35 +71,28 @@ impl DateIncrementor {
5871 let offset = range.from() - from_in_text;
5972 let range = Range::new(date.start() + offset, date.end() + offset);
6073
61− let year = captures.get(1)?;
62− let month = captures.get(2)?;
63− let day = captures.get(3)?;
64−
65− let year_range = year.range();
66− let month_range = month.range();
67− let day_range = day.range();
74+ let (year, month, day) = (captures.get(1)?, captures.get(2)?, captures.get(3)?);
75+ let (year_range, month_range, day_range) = (year.range(), month.range(), day.range());
6876
69− let to_inclusive = if to_in_text > from_in_text {
70− to_in_text - 1
71− } else {
72− to_in_text
73− };
74− let field = if year_range.contains(&from_in_text) && year_range.contains(&to_inclusive)
77+ let field = if year_range.contains(&from_in_text)
78+ && year_range.contains(&(to_in_text - 1))
7579 {
7680 DateField::Year
77− } else if month_range.contains(&from_in_text) && month_range.contains(&to_inclusive) {
81+ } else if month_range.contains(&from_in_text) && month_range.contains(&(to_in_text - 1))
82+ {
7883 DateField::Month
79− } else if day_range.contains(&from_in_text) && day_range.contains(&to_inclusive) {
84+ } else if day_range.contains(&from_in_text) && day_range.contains(&(to_in_text - 1)) {
8085 DateField::Day
8186 } else {
8287 return None;
8388 };
8489
85− let year: i16 = year.as_str().parse().ok()?;
86− let month: u8 = month.as_str().parse().ok()?;
87− let day: u8 = day.as_str().parse().ok()?;
88−
89− let date = Date::new(year, month, day).ok()?;
90+ let date = Date::new(
91+ year.as_str().parse::<i16>().ok()?,
92+ month.as_str().parse::<u8>().ok()?,
93+ day.as_str().parse::<u8>().ok()?,
94+ )
95+ .ok()?;
9096
9197 Some(DateIncrementor {
9298 date,
@@ -131,8 +137,8 @@ mod test {
131137 fn test_create_incrementor_for_year_with_dashes() {
132138 let rope = Rope::from_str("2021-11-15");
133139
134− for head in 0..=3 {
135− let range = Range::point(head);
140+ for cursor in 0..=3 {
141+ let range = Range::new(cursor, cursor + 1);
136142 assert_eq!(
137143 DateIncrementor::from_range(rope.slice(..), range),
138144 Some(DateIncrementor {
@@ -149,8 +155,8 @@ mod test {
149155 fn test_create_incrementor_for_month_with_dashes() {
150156 let rope = Rope::from_str("2021-11-15");
151157
152− for head in 5..=6 {
153− let range = Range::point(head);
158+ for cursor in 5..=6 {
159+ let range = Range::new(cursor, cursor + 1);
154160 assert_eq!(
155161 DateIncrementor::from_range(rope.slice(..), range),
156162 Some(DateIncrementor {
@@ -167,8 +173,8 @@ mod test {
167173 fn test_create_incrementor_for_day_with_dashes() {
168174 let rope = Rope::from_str("2021-11-15");
169175
170− for head in 8..=9 {
171− let range = Range::point(head);
176+ for cursor in 8..=9 {
177+ let range = Range::new(cursor, cursor + 1);
172178 assert_eq!(
173179 DateIncrementor::from_range(rope.slice(..), range),
174180 Some(DateIncrementor {
@@ -185,8 +191,8 @@ mod test {
185191 fn test_try_create_incrementor_on_dashes() {
186192 let rope = Rope::from_str("2021-11-15");
187193
188− for head in &[4, 7] {
189− let range = Range::point(*head);
194+ for &cursor in &[4, 7] {
195+ let range = Range::new(cursor, cursor + 1);
190196 assert_eq!(DateIncrementor::from_range(rope.slice(..), range), None,);
191197 }
192198 }
@@ -195,8 +201,8 @@ mod test {
195201 fn test_create_incrementor_for_year_with_slashes() {
196202 let rope = Rope::from_str("2021/11/15");
197203
198− for head in 0..=3 {
199− let range = Range::point(head);
204+ for cursor in 0..=3 {
205+ let range = Range::new(cursor, cursor + 1);
200206 assert_eq!(
201207 DateIncrementor::from_range(rope.slice(..), range),
202208 Some(DateIncrementor {
@@ -213,8 +219,8 @@ mod test {
213219 fn test_create_incrementor_for_month_with_slashes() {
214220 let rope = Rope::from_str("2021/11/15");
215221
216− for head in 5..=6 {
217− let range = Range::point(head);
222+ for cursor in 5..=6 {
223+ let range = Range::new(cursor, cursor + 1);
218224 assert_eq!(
219225 DateIncrementor::from_range(rope.slice(..), range),
220226 Some(DateIncrementor {
@@ -231,8 +237,8 @@ mod test {
231237 fn test_create_incrementor_for_day_with_slashes() {
232238 let rope = Rope::from_str("2021/11/15");
233239
234− for head in 8..=9 {
235− let range = Range::point(head);
240+ for cursor in 8..=9 {
241+ let range = Range::new(cursor, cursor + 1);
236242 assert_eq!(
237243 DateIncrementor::from_range(rope.slice(..), range),
238244 Some(DateIncrementor {
@@ -249,8 +255,8 @@ mod test {
249255 fn test_try_create_incrementor_on_slashes() {
250256 let rope = Rope::from_str("2021/11/15");
251257
252− for head in &[4, 7] {
253− let range = Range::point(*head);
258+ for &cursor in &[4, 7] {
259+ let range = Range::new(cursor, cursor + 1);
254260 assert_eq!(DateIncrementor::from_range(rope.slice(..), range), None,);
255261 }
256262 }
@@ -258,7 +264,7 @@ mod test {
258264 #[test]
259265 fn test_date_surrounded_by_spaces() {
260266 let rope = Rope::from_str(" 2021-11-15 ");
261− let range = Range::point(3);
267+ let range = Range::new(3, 4);
262268 assert_eq!(
263269 DateIncrementor::from_range(rope.slice(..), range),
264270 Some(DateIncrementor {
@@ -273,7 +279,7 @@ mod test {
273279 #[test]
274280 fn test_date_in_single_quotes() {
275281 let rope = Rope::from_str("date = '2021-11-15'");
276− let range = Range::point(10);
282+ let range = Range::new(10, 11);
277283 assert_eq!(
278284 DateIncrementor::from_range(rope.slice(..), range),
279285 Some(DateIncrementor {
@@ -288,7 +294,7 @@ mod test {
288294 #[test]
289295 fn test_date_in_double_quotes() {
290296 let rope = Rope::from_str("let date = \"2021-11-15\";");
291− let range = Range::point(12);
297+ let range = Range::new(12, 13);
292298 assert_eq!(
293299 DateIncrementor::from_range(rope.slice(..), range),
294300 Some(DateIncrementor {
@@ -303,14 +309,51 @@ mod test {
303309 #[test]
304310 fn test_date_cursor_one_right_of_date() {
305311 let rope = Rope::from_str("2021-11-15 ");
306− let range = Range::point(10);
312+ let range = Range::new(10, 11);
307313 assert_eq!(DateIncrementor::from_range(rope.slice(..), range), None);
308314 }
309315
310316 #[test]
311317 fn test_date_cursor_one_left_of_number() {
312318 let rope = Rope::from_str(" 2021-11-15");
319+ let range = Range::new(0, 1);
320+ assert_eq!(DateIncrementor::from_range(rope.slice(..), range), None);
321+ }
322+
323+ #[test]
324+ fn test_date_empty_range_at_beginning() {
325+ let rope = Rope::from_str("2021-11-15");
313326 let range = Range::point(0);
327+ assert_eq!(
328+ DateIncrementor::from_range(rope.slice(..), range),
329+ Some(DateIncrementor {
330+ date: Date::new(2021, 11, 15).unwrap(),
331+ range: Range::new(0, 10),
332+ field: DateField::Year,
333+ format: FORMATS[0],
334+ })
335+ );
336+ }
337+
338+ #[test]
339+ fn test_date_empty_range_at_in_middle() {
340+ let rope = Rope::from_str("2021-11-15");
341+ let range = Range::point(5);
342+ assert_eq!(
343+ DateIncrementor::from_range(rope.slice(..), range),
344+ Some(DateIncrementor {
345+ date: Date::new(2021, 11, 15).unwrap(),
346+ range: Range::new(0, 10),
347+ field: DateField::Month,
348+ format: FORMATS[0],
349+ })
350+ );
351+ }
352+
353+ #[test]
354+ fn test_date_empty_range_at_end() {
355+ let rope = Rope::from_str("2021-11-15");
356+ let range = Range::point(10);
314357 assert_eq!(DateIncrementor::from_range(rope.slice(..), range), None);
315358 }
316359
@@ -337,7 +380,7 @@ mod test {
337380
338381 for invalid in tests {
339382 let rope = Rope::from_str(invalid);
340− let range = Range::point(0);
383+ let range = Range::new(0, 1);
341384
342385 assert_eq!(DateIncrementor::from_range(rope.slice(..), range), None);
343386 }
@@ -367,7 +410,7 @@ mod test {
367410
368411 for (original, cursor, amount, expected) in tests {
369412 let rope = Rope::from_str(original);
370− let range = Range::point(cursor);
413+ let range = Range::new(cursor, cursor + 1);
371414 assert_eq!(
372415 DateIncrementor::from_range(rope.slice(..), range)
373416 .unwrap()