Highlighters does not need to inherit from HighlighterGroup

Just compose, to avoid coupling Highlighters with the Highlighter
interface. And yeah, that naming is a bit confusing.
This commit is contained in:
Maxime Coste 2017-10-31 13:53:08 +08:00
parent 6272847ace
commit 94a0c9bb45
4 changed files with 23 additions and 17 deletions

View File

@ -653,7 +653,7 @@ Completions highlighter_cmd_completer(
if (scope == "shared")
root = &DefinedHighlighters::instance();
else if (auto* s = get_scope_ifp(scope, context))
root = &s->highlighters();
root = &s->highlighters().group();
else
return {};
@ -676,8 +676,8 @@ Highlighter& get_highlighter(const Context& context, StringView path)
auto sep_it = find(path, '/');
StringView scope{path.begin(), sep_it};
auto* root = (scope == "shared") ? (HighlighterGroup*)&DefinedHighlighters::instance()
: (HighlighterGroup*)&get_scope(scope, context).highlighters();
auto* root = (scope == "shared") ? static_cast<HighlighterGroup*>(&DefinedHighlighters::instance())
: static_cast<HighlighterGroup*>(&get_scope(scope, context).highlighters().group());
if (sep_it != path.end())
return root->get_child(StringView{sep_it+1, path.end()});
return *root;

View File

@ -69,19 +69,19 @@ Completions HighlighterGroup::complete_child(StringView path, ByteCount cursor_p
return { 0, 0, std::move(candidates) };
}
void Highlighters::do_highlight(const Context& context, HighlightPass pass,
DisplayBuffer& display_buffer, BufferRange range)
void Highlighters::highlight(const Context& context, HighlightPass pass,
DisplayBuffer& display_buffer, BufferRange range)
{
if (m_parent)
m_parent->do_highlight(context, pass, display_buffer, range);
HighlighterGroup::do_highlight(context, pass, display_buffer, range);
m_parent->highlight(context, pass, display_buffer, range);
m_group.highlight(context, pass, display_buffer, range);
}
void Highlighters::do_compute_display_setup(const Context& context, HighlightPass pass, DisplaySetup& setup)
void Highlighters::compute_display_setup(const Context& context, HighlightPass pass, DisplaySetup& setup)
{
if (m_parent)
m_parent->do_compute_display_setup(context, pass, setup);
HighlighterGroup::do_compute_display_setup(context, pass, setup);
m_parent->compute_display_setup(context, pass, setup);
m_group.compute_display_setup(context, pass, setup);
}
}

View File

@ -36,19 +36,25 @@ protected:
HighlighterMap m_highlighters;
};
class Highlighters : public HighlighterGroup, public SafeCountable
struct ScopeList;
class Highlighters : public SafeCountable
{
public:
Highlighters(Highlighters& parent) : HighlighterGroup{HighlightPass::All}, SafeCountable{}, m_parent(&parent) {}
Highlighters(Highlighters& parent) : SafeCountable{}, m_parent{&parent}, m_group{HighlightPass::All} {}
HighlighterGroup& group() { return m_group; }
const HighlighterGroup& group() const { return m_group; }
void highlight(const Context& context, HighlightPass pass, DisplayBuffer& display_buffer, BufferRange range);
void compute_display_setup(const Context& context, HighlightPass pass, DisplaySetup& setup);
private:
void do_highlight(const Context& context, HighlightPass pass, DisplayBuffer& display_buffer, BufferRange range) override;
void do_compute_display_setup(const Context& context, HighlightPass pass, DisplaySetup& setup) override;
friend class Scope;
Highlighters() : HighlighterGroup{HighlightPass::All} {}
Highlighters() : m_group{HighlightPass::All} {}
SafePtr<Highlighters> m_parent;
HighlighterGroup m_group;
};
struct DefinedHighlighters : public HighlighterGroup,

View File

@ -28,7 +28,7 @@ Window::Window(Buffer& buffer)
options().register_watcher(*this);
setup_builtin_highlighters(m_builtin_highlighters);
setup_builtin_highlighters(m_builtin_highlighters.group());
for (auto& option : options().flatten_options())
on_option_changed(*option);