summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2020-01-05 18:21:20 +1100
committerMaxime Coste <mawww@kakoune.org>2020-01-05 18:58:32 +1100
commitb37638dda4531efd5953ec12a0331bcb0876ada3 (patch)
treed2f3359d8152000da18bfcf9218c6f341a7668e5 /src
parent80ffc4d34f2d6a5ae762abc63315699486dafcbe (diff)
Split RegexHighlighters matches per requested buffer ranges
When a region calls the regex highlighter, it is incorrect to share the regex cache as it means we can get matches that span multiple regions. Fixes #3041
Diffstat (limited to 'src')
-rw-r--r--src/highlighters.cc12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/highlighters.cc b/src/highlighters.cc
index 8878a726..82acdd53 100644
--- a/src/highlighters.cc
+++ b/src/highlighters.cc
@@ -333,7 +333,8 @@ private:
size_t m_timestamp = -1;
size_t m_regex_version = -1;
struct RangeAndMatches { BufferRange range; MatchList matches; };
- Vector<RangeAndMatches, MemoryDomain::Highlight> m_matches;
+ using RangeAndMatchesList = Vector<RangeAndMatches, MemoryDomain::Highlight>;
+ HashMap<BufferRange, RangeAndMatchesList, MemoryDomain::Highlight> m_matches;
};
BufferSideCache<Cache> m_cache;
@@ -377,17 +378,18 @@ private:
const MatchList& get_matches(const Buffer& buffer, BufferRange display_range, BufferRange buffer_range)
{
Cache& cache = m_cache.get(buffer);
- auto& matches = cache.m_matches;
if (cache.m_regex_version != m_regex_version or
cache.m_timestamp != buffer.timestamp() or
- matches.size() > 1000)
+ accumulate(cache.m_matches, (size_t)0, [](size_t c, auto&& m) { return c + m.value.size(); }) > 1000)
{
- matches.clear();
+ cache.m_matches.clear();
cache.m_timestamp = buffer.timestamp();
cache.m_regex_version = m_regex_version;
}
+ auto& matches = cache.m_matches[buffer_range];
+
const LineCount line_offset = 3;
BufferRange range{std::max<BufferCoord>(buffer_range.begin, display_range.begin.line - line_offset),
std::min<BufferCoord>(buffer_range.end, display_range.end.line + line_offset)};
@@ -1833,7 +1835,7 @@ public:
const bool apply_default = default_region_it != m_regions.end();
auto last_begin = (begin == regions.begin()) ?
- BufferCoord{0,0} : (begin-1)->end;
+ range.begin : (begin-1)->end;
kak_assert(begin <= end);
for (; begin != end; ++begin)
{