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