diff --git a/src/span/primitives.rs b/src/span/primitives.rs index f16d54de..b4570c5c 100644 --- a/src/span/primitives.rs +++ b/src/span/primitives.rs @@ -95,14 +95,13 @@ impl<'src> Span<'src> { /// /// Note that the trailing remainder condition is not enforced. pub(crate) fn trim_remainder(self, after: Span<'src>) -> Span<'src> { - // Sanity check: If after is longer than source, we can't trim. - let rlen = after.len(); - let slen = self.len(); + let offset = (self.offset + self.len()).min(after.offset); - if rlen >= slen { + if offset <= self.offset { + // Invalid input: We'll respond with an empty slice. self.slice(0..0) } else { - let trim_len = slen - rlen; + let trim_len = offset - self.offset; self.slice(0..trim_len) } } diff --git a/src/tests/span/primitives.rs b/src/tests/span/primitives.rs index 5710753e..562f38b8 100644 --- a/src/tests/span/primitives.rs +++ b/src/tests/span/primitives.rs @@ -567,4 +567,21 @@ mod trim_remainder { } ); } + + #[test] + fn rem_is_incomplete_subset_of_source() { + let source = Span::new("abc\ndef\n"); + let line1 = source.take_normalized_line(); + let line2 = line1.after.take_line(); + + assert_eq!( + source.trim_remainder(line2.item), + TSpan { + data: "abc\n", + line: 1, + col: 1, + offset: 0 + } + ); + } }