diff options
| author | Maxime Coste <mawww@kakoune.org> | 2018-06-28 21:32:46 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2018-07-05 07:54:28 +1000 |
| commit | 1574748d4e1346226d963af2ea92b2f80c95988f (patch) | |
| tree | 0ea6c3b81b51e4719d1a3d97cc37308d58bcd315 /src | |
| parent | 6d320328b0beda4ed250b505b6864046b697b179 (diff) | |
Invalidate cache when RegionsHighlighter subregions are modified
Diffstat (limited to 'src')
| -rw-r--r-- | src/highlighters.cc | 199 |
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) |
