1 #ifndef highlighter_group_hh_INCLUDED
2 #define highlighter_group_hh_INCLUDED
3 
4 #include "exception.hh"
5 #include "hash_map.hh"
6 #include "highlighter.hh"
7 #include "utils.hh"
8 #include "safe_ptr.hh"
9 
10 namespace Kakoune
11 {
12 
13 struct child_not_found : public runtime_error
14 {
15     using runtime_error::runtime_error;
16 };
17 
18 class HighlighterGroup : public Highlighter
19 {
20 public:
HighlighterGroup(HighlightPass passes)21     HighlighterGroup(HighlightPass passes) : Highlighter{passes} {}
22 
has_children() const23     bool has_children() const override { return true; }
24     void add_child(String name, std::unique_ptr<Highlighter>&& hl, bool override = false) override;
25     void remove_child(StringView id) override;
26 
27     Highlighter& get_child(StringView path) override;
28 
29     Completions complete_child(StringView path, ByteCount cursor_pos, bool group) const override;
30 
31     void fill_unique_ids(Vector<StringView>& unique_ids) const override;
32 
33 protected:
34     void do_highlight(HighlightContext context, DisplayBuffer& display_buffer, BufferRange range) override;
35     void do_compute_display_setup(HighlightContext context, DisplaySetup& setup) const override;
36 
37     using HighlighterMap = HashMap<String, std::unique_ptr<Highlighter>, MemoryDomain::Highlight>;
38     HighlighterMap m_highlighters;
39 };
40 
41 class Highlighters : public SafeCountable
42 {
43 public:
Highlighters(Highlighters & parent)44     Highlighters(Highlighters& parent) : SafeCountable{}, m_parent{&parent}, m_group{HighlightPass::All} {}
45 
group()46     HighlighterGroup& group() { return m_group; }
group() const47     const HighlighterGroup& group() const { return m_group; }
48 
49     void highlight(HighlightContext context, DisplayBuffer& display_buffer, BufferRange range);
50     void compute_display_setup(HighlightContext context, DisplaySetup& setup) const;
51 
52 private:
53     friend class Scope;
Highlighters()54     Highlighters() : m_group{HighlightPass::All} {}
55 
56     SafePtr<Highlighters> m_parent;
57     HighlighterGroup m_group;
58 };
59 
60 struct SharedHighlighters : public HighlighterGroup,
61                             public Singleton<SharedHighlighters>
62 {
SharedHighlightersKakoune::SharedHighlighters63     SharedHighlighters() : HighlighterGroup{HighlightPass::All} {}
64 };
65 
66 }
67 
68 #endif // highlighter_group_hh_INCLUDED
69