Skip to content
This repository was archived by the owner on Dec 29, 2022. It is now read-only.

Commit 6ae8421

Browse files
authored
Merge pull request #1600 from bennetthardwick/fix/load-lines
Fix rls-vfs line loading inclusivity
2 parents df11a04 + e27abd1 commit 6ae8421

File tree

2 files changed

+86
-10
lines changed

2 files changed

+86
-10
lines changed

rls-vfs/src/lib.rs

+3-10
Original file line numberDiff line numberDiff line change
@@ -754,14 +754,7 @@ impl TextFile {
754754
}
755755

756756
fn load_line(&self, line: span::Row<span::ZeroIndexed>) -> Result<&str, Error> {
757-
let start = *try_opt_loc!(self.line_indices.get(line.0 as usize));
758-
let end = *try_opt_loc!(self.line_indices.get(line.0 as usize + 1));
759-
760-
if (end as usize) <= self.text.len() && start <= end {
761-
Ok(&self.text[start as usize..end as usize])
762-
} else {
763-
Err(Error::BadLocation)
764-
}
757+
self.load_lines(line, line)
765758
}
766759

767760
fn load_lines(
@@ -770,7 +763,7 @@ impl TextFile {
770763
line_end: span::Row<span::ZeroIndexed>,
771764
) -> Result<&str, Error> {
772765
let line_start = line_start.0 as usize;
773-
let mut line_end = line_end.0 as usize;
766+
let mut line_end = line_end.0 as usize + 1;
774767
if line_end >= self.line_indices.len() {
775768
line_end = self.line_indices.len() - 1;
776769
}
@@ -795,7 +788,7 @@ impl TextFile {
795788
let start = (*try_opt_loc!(self.line_indices.get(line_start))) as usize;
796789
let start = start + range.col_start.0 as usize;
797790
let end = (*try_opt_loc!(self.line_indices.get(line_end))) as usize;
798-
let end = end + range.col_end.0 as usize;
791+
let end = end + range.col_end.0 as usize + 1;
799792

800793
if (end) <= self.text.len() && start <= end {
801794
Ok(&self.text[start..end])

rls-vfs/src/test.rs

+83
Original file line numberDiff line numberDiff line change
@@ -354,3 +354,86 @@ fn test_wide_utf16() {
354354

355355
assert_eq!(vfs.load_file(&Path::new("foo")).unwrap(), FileContents::Text("".to_owned()),);
356356
}
357+
358+
#[test]
359+
fn test_load_span() {
360+
let vfs = VfsInternal::<MockFileLoader, ()>::new();
361+
let changes = [Change::AddFile {
362+
file: PathBuf::from("foo"),
363+
text: String::from("hello\nfrom\nthe\nother\nside"),
364+
}];
365+
366+
vfs.on_changes(&changes).unwrap();
367+
368+
assert_eq!(
369+
vfs.load_span(Span::from_positions(
370+
Position::new(Row::new_zero_indexed(0), Column::new_zero_indexed(0)),
371+
Position::new(Row::new_zero_indexed(4), Column::new_zero_indexed(3)),
372+
"foo",
373+
),)
374+
.unwrap(),
375+
"hello\nfrom\nthe\nother\nside"
376+
);
377+
378+
assert_eq!(
379+
vfs.load_span(Span::from_positions(
380+
Position::new(Row::new_zero_indexed(0), Column::new_zero_indexed(2)),
381+
Position::new(Row::new_zero_indexed(4), Column::new_zero_indexed(2)),
382+
"foo",
383+
),)
384+
.unwrap(),
385+
"llo\nfrom\nthe\nother\nsid"
386+
);
387+
388+
assert_eq!(
389+
vfs.load_span(Span::from_positions(
390+
Position::new(Row::new_zero_indexed(2), Column::new_zero_indexed(1)),
391+
Position::new(Row::new_zero_indexed(2), Column::new_zero_indexed(2)),
392+
"foo",
393+
),)
394+
.unwrap(),
395+
"he"
396+
);
397+
}
398+
399+
#[test]
400+
fn test_load_lines() {
401+
let vfs = VfsInternal::<MockFileLoader, ()>::new();
402+
let changes = [Change::AddFile {
403+
file: PathBuf::from("foo"),
404+
text: String::from("hello\nfrom\nthe\nother\nside"),
405+
}];
406+
407+
vfs.on_changes(&changes).unwrap();
408+
409+
assert_eq!(
410+
vfs.load_lines(&PathBuf::from("foo"), Row::new_zero_indexed(0), Row::new_zero_indexed(0))
411+
.unwrap(),
412+
"hello\n"
413+
);
414+
assert_eq!(
415+
vfs.load_lines(&PathBuf::from("foo"), Row::new_zero_indexed(0), Row::new_zero_indexed(4))
416+
.unwrap(),
417+
"hello\nfrom\nthe\nother\nside"
418+
);
419+
assert_eq!(
420+
vfs.load_lines(&PathBuf::from("foo"), Row::new_zero_indexed(2), Row::new_zero_indexed(4))
421+
.unwrap(),
422+
"the\nother\nside"
423+
);
424+
}
425+
426+
#[test]
427+
fn test_load_line() {
428+
let vfs = VfsInternal::<MockFileLoader, ()>::new();
429+
let changes = [Change::AddFile {
430+
file: PathBuf::from("foo"),
431+
text: String::from("hello\nfrom\nthe\nother\nside"),
432+
}];
433+
434+
vfs.on_changes(&changes).unwrap();
435+
436+
assert_eq!(vfs.load_line(&PathBuf::from("foo"), Row::new_zero_indexed(0)).unwrap(), "hello\n");
437+
assert_eq!(vfs.load_line(&PathBuf::from("foo"), Row::new_zero_indexed(2)).unwrap(), "the\n");
438+
assert_eq!(vfs.load_line(&PathBuf::from("foo"), Row::new_zero_indexed(4)).unwrap(), "side");
439+
}

0 commit comments

Comments
 (0)