diff options
| author | Maxime Coste <mawww@kakoune.org> | 2020-04-25 10:57:23 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2020-04-27 14:31:26 +1000 |
| commit | fde4c60dd9ff32a7dcf915ea17c345a5262f023c (patch) | |
| tree | d3b81867a1956bc829a1b6ce8b7e6fbbf8f0264b /src | |
| parent | f7ad8bd70e8a28712ef16ae8bfbe5fbe89ad701a (diff) | |
Factor option based highlighters
Diffstat (limited to 'src')
| -rw-r--r-- | src/highlighters.cc | 74 |
1 files changed, 34 insertions, 40 deletions
diff --git a/src/highlighters.cc b/src/highlighters.cc index d3fe1164..6e877dc4 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -1493,6 +1493,34 @@ InclusiveBufferRange option_from_string(Meta::Type<InclusiveBufferRange>, String return { std::min(first, last), std::max(first, last) }; } +template<typename OptionType, typename DerivedType> +struct OptionBasedHighlighter : Highlighter +{ + OptionBasedHighlighter(String option_name) + : Highlighter{HighlightPass::Colorize} + , m_option_name{std::move(option_name)} {} + + static std::unique_ptr<Highlighter> create(HighlighterParameters params, Highlighter*) + { + if (params.size() != 1) + throw runtime_error("wrong parameter count"); + + const String& option_name = params[0]; + // throw if wrong option type + GlobalScope::instance().options()[option_name].get<OptionType>(); + + return std::make_unique<DerivedType>(option_name); + } + + OptionType& get_option(const HighlightContext& context) + { + return context.context.options()[m_option_name].get_mutable<OptionType>(); + } + +private: + const String m_option_name; +}; + BufferCoord& get_first(RangeAndString& r) { return std::get<0>(r).first; } BufferCoord& get_last(RangeAndString& r) { return std::get<0>(r).last; } @@ -1511,29 +1539,14 @@ void option_update(RangeAndStringList& opt, const Context& context) update_ranges(context.buffer(), opt.prefix, opt.list); } -struct RangesHighlighter : Highlighter +struct RangesHighlighter : OptionBasedHighlighter<RangeAndStringList, RangesHighlighter> { - RangesHighlighter(String option_name) - : Highlighter{HighlightPass::Colorize} - , m_option_name{std::move(option_name)} {} - - static std::unique_ptr<Highlighter> create(HighlighterParameters params, Highlighter*) - { - if (params.size() != 1) - throw runtime_error("wrong parameter count"); - - const String& option_name = params[0]; - // throw if wrong option type - GlobalScope::instance().options()[option_name].get<RangeAndStringList>(); - - return std::make_unique<RangesHighlighter>(option_name); - } - + using RangesHighlighter::OptionBasedHighlighter::OptionBasedHighlighter; private: void do_highlight(HighlightContext context, DisplayBuffer& display_buffer, BufferRange) override { auto& buffer = context.context.buffer(); - auto& range_and_faces = context.context.options()[m_option_name].get_mutable<RangeAndStringList>(); + auto& range_and_faces = get_option(context); update_ranges(buffer, range_and_faces.prefix, range_and_faces.list); for (auto& [range, face] : range_and_faces.list) @@ -1548,33 +1561,16 @@ private: {} } } - - const String m_option_name; }; -struct ReplaceRangesHighlighter : Highlighter +struct ReplaceRangesHighlighter : OptionBasedHighlighter<RangeAndStringList, ReplaceRangesHighlighter> { - ReplaceRangesHighlighter(String option_name) - : Highlighter{HighlightPass::Colorize} - , m_option_name{std::move(option_name)} {} - - static std::unique_ptr<Highlighter> create(HighlighterParameters params, Highlighter*) - { - if (params.size() != 1) - throw runtime_error("wrong parameter count"); - - const String& option_name = params[0]; - // throw if wrong option type - GlobalScope::instance().options()[option_name].get<RangeAndStringList>(); - - return std::make_unique<ReplaceRangesHighlighter>(option_name); - } - + using ReplaceRangesHighlighter::OptionBasedHighlighter::OptionBasedHighlighter; private: void do_highlight(HighlightContext context, DisplayBuffer& display_buffer, BufferRange) override { auto& buffer = context.context.buffer(); - auto& range_and_faces = context.context.options()[m_option_name].get_mutable<RangeAndStringList>(); + auto& range_and_faces = get_option(context); update_ranges(buffer, range_and_faces.prefix, range_and_faces.list); for (auto& [range, spec] : range_and_faces.list) @@ -1596,8 +1592,6 @@ private: {} } } - - const String m_option_name; }; HighlightPass parse_passes(StringView str) |
