From 26c83be35aa1c8b090e564f1433700866b181cd4 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 31 Oct 2022 10:25:08 -0600 Subject: [PATCH] Combine spans in add_span if possible --- src/attrs.rs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/attrs.rs b/src/attrs.rs index fdcef08..4392192 100644 --- a/src/attrs.rs +++ b/src/attrs.rs @@ -205,11 +205,36 @@ impl<'a> AttrsList<'a> { self.spans.push(reworked); } - //Finally lets add the new span. it should fit now. - self.spans.push((range, attrs)); + // Combine span if possible + let mut combined = false; + for span in self.spans.iter_mut() { + if span.1 != attrs { + // Ignore not matching attrs + continue; + } + + if span.0.end == range.start { + // Extend span with range at end + span.0.end = range.end; + combined = true; + break; + } + + if span.0.start == range.end { + // Extend span with range at start + span.0.start = range.start; + combined = true; + break; + } + } + + if ! combined { + //Finally lets add the new span. it should fit now. + self.spans.push((range, attrs)); + } //sort by start to speed up further additions - self.spans.sort_by(|a, b| a.0.start.partial_cmp(&b.0.start).unwrap()) + self.spans.sort_by(|a, b| a.0.start.partial_cmp(&b.0.start).unwrap()); } /// Get the highest priority attribute span for a range