summaryrefslogtreecommitdiff
path: root/src/command_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2020-06-01 20:46:48 +1000
committerMaxime Coste <mawww@kakoune.org>2020-06-01 20:46:48 +1000
commit0fba373d1d1b852b00db54ad344c69629ef4e0da (patch)
tree7728c67b49f600cbabbd6e762c201827dc1e523b /src/command_manager.cc
parent321facb594e4ccf9d9d7233b4e862a2e7a94e206 (diff)
Replace some tag dispatch with if constexpr
Diffstat (limited to 'src/command_manager.cc')
-rw-r--r--src/command_manager.cc57
1 files changed, 21 insertions, 36 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc
index cbe29779..3a8ffaea 100644
--- a/src/command_manager.cc
+++ b/src/command_manager.cc
@@ -300,41 +300,10 @@ Token parse_percent_token(Reader& reader, bool throw_on_unterminated)
}
}
-auto expand_option(const Option& opt, std::true_type)
-{
- return opt.get_as_string(Quoting::Raw);
-}
-
-auto expand_option(const Option& opt, std::false_type)
-{
- return opt.get_as_strings();
-}
-
-auto expand_register(StringView reg, const Context& context, std::true_type)
-{
- return context.main_sel_register_value(reg).str();
-}
-
-auto expand_register(StringView reg, const Context& context, std::false_type)
-{
- return RegisterManager::instance()[reg].get(context) | gather<Vector<String>>();
-}
-
-String expand_arobase(ConstArrayView<String> params, std::true_type)
-{
- return join(params, ' ', false);
-}
-
-Vector<String> expand_arobase(ConstArrayView<String> params, std::false_type)
-{
- return {params.begin(), params.end()};
-}
-
template<bool single>
std::conditional_t<single, String, Vector<String>>
expand_token(const Token& token, const Context& context, const ShellContext& shell_context)
{
- using IsSingle = std::integral_constant<bool, single>;
auto& content = token.content;
switch (token.type)
{
@@ -355,24 +324,40 @@ expand_token(const Token& token, const Context& context, const ShellContext& she
return {str};
}
case Token::Type::RegisterExpand:
- return expand_register(content, context, IsSingle{});
+ if constexpr (single)
+ return context.main_sel_register_value(content).str();
+ else
+ return RegisterManager::instance()[content].get(context) | gather<Vector<String>>();
case Token::Type::OptionExpand:
- return expand_option(context.options()[content], IsSingle{});
+ {
+ auto& opt = context.options()[content];
+ if constexpr (single)
+ return opt.get_as_string(Quoting::Raw);
+ else
+ return opt.get_as_strings();
+ }
case Token::Type::ValExpand:
{
auto it = shell_context.env_vars.find(content);
if (it != shell_context.env_vars.end())
return {it->value};
+
+ auto val = ShellManager::instance().get_val(content, context);
if constexpr (single)
- return join(ShellManager::instance().get_val(content, context), false, ' ');
+ return join(val, false, ' ');
else
- return ShellManager::instance().get_val(content, context);
+ return val;
}
case Token::Type::ArgExpand:
{
auto& params = shell_context.params;
if (content == '@')
- return expand_arobase(params, IsSingle{});
+ {
+ if constexpr (single)
+ return join(params, ' ', false);
+ else
+ return Vector<String>{params.begin(), params.end()};
+ }
const int arg = str_to_int(content)-1;
if (arg < 0)