Skip to content

Commit 6cff132

Browse files
committed
feat(span): add Span::merge_within method (#15869)
Add `Span::merge_within` method that creates a connected Span that is covered by both Spans if they are within a specified Span. The bug described in the OP of #15778 is caused by trying to create a Span assuming that the Spans are adjacent. This method would avoid that kind of issue.
1 parent b3d6f45 commit 6cff132

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

crates/oxc_span/src/span.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,28 @@ impl Span {
226226
Self::new(self.start.min(other.start), self.end.max(other.end))
227227
}
228228

229+
/// Create a [`Span`] covering the maximum range of two [`Span`]s if that range is within the specified `within` [`Span`].
230+
///
231+
/// # Example
232+
/// ```
233+
/// use oxc_span::Span;
234+
///
235+
/// let span1 = Span::new(0, 3);
236+
/// let span2 = Span::new(3, 8);
237+
/// let merged_span = span1.merge_within(span2, Span::new(0, 12));
238+
/// assert_eq!(merged_span, Some(Span::new(0, 8)));
239+
///
240+
/// let span1 = Span::new(0, 1);
241+
/// let span2 = Span::new(5, 8);
242+
/// let merged_span = span1.merge_within(span2, Span::new(0, 4));
243+
/// assert_eq!(merged_span, None);
244+
/// ```
245+
#[must_use]
246+
pub fn merge_within(self, other: Self, within: Self) -> Option<Self> {
247+
let merged = self.merge(other);
248+
if within.contains_inclusive(merged) { Some(merged) } else { None }
249+
}
250+
229251
/// Create a [`Span`] that is grown by `offset` on either side.
230252
///
231253
/// This is equivalent to `span.expand_left(offset).expand_right(offset)`.

0 commit comments

Comments
 (0)