summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2018-06-28 21:32:46 +1000
committerMaxime Coste <mawww@kakoune.org>2018-07-05 07:54:28 +1000
commit1574748d4e1346226d963af2ea92b2f80c95988f (patch)
tree0ea6c3b81b51e4719d1a3d97cc37308d58bcd315 /src
parent6d320328b0beda4ed250b505b6864046b697b179 (diff)
Invalidate cache when RegionsHighlighter subregions are modified
Diffstat (limited to 'src')
-rw-r--r--src/highlighters.cc199
1 files changed, 102 insertions, 97 deletions
diff --git a/src/highlighters.cc b/src/highlighters.cc
index 7ab089ad..5e6a2045 100644
--- a/src/highlighters.cc
+++ b/src/highlighters.cc
@@ -1811,6 +1811,7 @@ public:
}
m_regions.insert({std::move(name), std::move(region_hl)});
+ ++m_regions_timestamp;
}
Completions complete_child(StringView path, ByteCount cursor_pos, bool group) const override
@@ -1864,100 +1865,6 @@ public:
}
private:
- struct RegionHighlighter : public Highlighter
- {
- RegionHighlighter(std::unique_ptr<Highlighter>&& delegate,
- Regex begin, Regex end, Regex recurse,
- bool match_capture)
- : Highlighter{delegate->passes()},
- m_delegate{std::move(delegate)},
- m_begin{std::move(begin)}, m_end{std::move(end)}, m_recurse{std::move(recurse)},
- m_match_capture{match_capture}
- {
- }
-
- RegionHighlighter(std::unique_ptr<Highlighter>&& delegate)
- : Highlighter{delegate->passes()}, m_delegate{std::move(delegate)}, m_default{true}
- {
- }
-
- bool has_children() const override
- {
- return m_delegate->has_children();
- }
-
- Highlighter& get_child(StringView path) override
- {
- return m_delegate->get_child(path);
- }
-
- void add_child(String name, std::unique_ptr<Highlighter>&& hl) override
- {
- return m_delegate->add_child(name, std::move(hl));
- }
-
- void remove_child(StringView id) override
- {
- return m_delegate->remove_child(id);
- }
-
- Completions complete_child(StringView path, ByteCount cursor_pos, bool group) const override
- {
- return m_delegate->complete_child(path, cursor_pos, group);
- }
-
- void fill_unique_ids(Vector<StringView>& unique_ids) const override
- {
- return m_delegate->fill_unique_ids(unique_ids);
- }
-
- void do_highlight(HighlightContext context, DisplayBuffer& display_buffer, BufferRange range) override
- {
- return m_delegate->highlight(context, display_buffer, range);
- }
-
- RegionMatches find_matches(const Buffer& buffer) const
- {
- RegionMatches res;
- if (m_default)
- return res;
-
- Kakoune::find_matches(buffer, res.begin_matches, m_begin, m_match_capture);
- Kakoune::find_matches(buffer, res.end_matches, m_end, m_match_capture);
- if (not m_recurse.empty())
- Kakoune::find_matches(buffer, res.recurse_matches, m_recurse, m_match_capture);
- return res;
- }
-
- void update_matches(const Buffer& buffer,
- ConstArrayView<LineModification> modifs,
- RegionMatches& matches) const
- {
- if (m_default)
- return;
-
- Kakoune::update_matches(buffer, modifs, matches.begin_matches, m_begin, m_match_capture);
- Kakoune::update_matches(buffer, modifs, matches.end_matches, m_end, m_match_capture);
- if (not m_recurse.empty())
- Kakoune::update_matches(buffer, modifs, matches.recurse_matches, m_recurse, m_match_capture);
- }
-
- bool match_capture() const { return m_match_capture; }
- bool is_default() const { return m_default; }
-
- private:
- std::unique_ptr<Highlighter> m_delegate;
-
- Regex m_begin;
- Regex m_end;
- Regex m_recurse;
- bool m_match_capture = false;
- bool m_default = false;
- };
-
- HashMap<String, std::unique_ptr<RegionHighlighter>, MemoryDomain::Highlight> m_regions;
- String m_default_region;
-
struct Region
{
BufferCoord begin;
@@ -1969,10 +1876,10 @@ private:
struct Cache
{
size_t timestamp = 0;
+ size_t regions_timestamp = 0;
Vector<RegionMatches, MemoryDomain::Highlight> matches;
HashMap<BufferRange, RegionList, MemoryDomain::Highlight> regions;
};
- BufferSideCache<Cache> m_cache;
using RegionAndMatch = std::pair<size_t, RegexMatchList::const_iterator>;
@@ -1996,9 +1903,9 @@ private:
{
Cache& cache = m_cache.get(buffer);
const size_t buf_timestamp = buffer.timestamp();
- if (cache.timestamp != buf_timestamp)
+ if (cache.timestamp != buf_timestamp or cache.regions_timestamp != m_regions_timestamp)
{
- if (cache.timestamp == 0)
+ if (cache.timestamp == 0 or cache.regions_timestamp != m_regions_timestamp)
{
cache.matches.resize(m_regions.size());
for (size_t i = 0; i < m_regions.size(); ++i)
@@ -2057,8 +1964,106 @@ private:
}
}
cache.timestamp = buf_timestamp;
+ cache.regions_timestamp = m_regions_timestamp;
return regions;
}
+
+ struct RegionHighlighter : public Highlighter
+ {
+ RegionHighlighter(std::unique_ptr<Highlighter>&& delegate,
+ Regex begin, Regex end, Regex recurse,
+ bool match_capture)
+ : Highlighter{delegate->passes()},
+ m_delegate{std::move(delegate)},
+ m_begin{std::move(begin)}, m_end{std::move(end)}, m_recurse{std::move(recurse)},
+ m_match_capture{match_capture}
+ {
+ }
+
+ RegionHighlighter(std::unique_ptr<Highlighter>&& delegate)
+ : Highlighter{delegate->passes()}, m_delegate{std::move(delegate)}, m_default{true}
+ {
+ }
+
+ bool has_children() const override
+ {
+ return m_delegate->has_children();
+ }
+
+ Highlighter& get_child(StringView path) override
+ {
+ return m_delegate->get_child(path);
+ }
+
+ void add_child(String name, std::unique_ptr<Highlighter>&& hl) override
+ {
+ return m_delegate->add_child(name, std::move(hl));
+ }
+
+ void remove_child(StringView id) override
+ {
+ return m_delegate->remove_child(id);
+ }
+
+ Completions complete_child(StringView path, ByteCount cursor_pos, bool group) const override
+ {
+ return m_delegate->complete_child(path, cursor_pos, group);
+ }
+
+ void fill_unique_ids(Vector<StringView>& unique_ids) const override
+ {
+ return m_delegate->fill_unique_ids(unique_ids);
+ }
+
+ void do_highlight(HighlightContext context, DisplayBuffer& display_buffer, BufferRange range) override
+ {
+ return m_delegate->highlight(context, display_buffer, range);
+ }
+
+ RegionMatches find_matches(const Buffer& buffer) const
+ {
+ RegionMatches res;
+ if (m_default)
+ return res;
+
+ Kakoune::find_matches(buffer, res.begin_matches, m_begin, m_match_capture);
+ Kakoune::find_matches(buffer, res.end_matches, m_end, m_match_capture);
+ if (not m_recurse.empty())
+ Kakoune::find_matches(buffer, res.recurse_matches, m_recurse, m_match_capture);
+ return res;
+ }
+
+ void update_matches(const Buffer& buffer,
+ ConstArrayView<LineModification> modifs,
+ RegionMatches& matches) const
+ {
+ if (m_default)
+ return;
+
+ Kakoune::update_matches(buffer, modifs, matches.begin_matches, m_begin, m_match_capture);
+ Kakoune::update_matches(buffer, modifs, matches.end_matches, m_end, m_match_capture);
+ if (not m_recurse.empty())
+ Kakoune::update_matches(buffer, modifs, matches.recurse_matches, m_recurse, m_match_capture);
+ }
+
+ bool match_capture() const { return m_match_capture; }
+ bool is_default() const { return m_default; }
+
+ private:
+ std::unique_ptr<Highlighter> m_delegate;
+
+ Regex m_begin;
+ Regex m_end;
+ Regex m_recurse;
+ bool m_match_capture = false;
+ bool m_default = false;
+ };
+
+ HashMap<String, std::unique_ptr<RegionHighlighter>, MemoryDomain::Highlight> m_regions;
+ String m_default_region;
+
+ size_t m_regions_timestamp = 0;
+ BufferSideCache<Cache> m_cache;
};
void setup_builtin_highlighters(HighlighterGroup& group)