Move option name completion to the OptionRegistry
Option names are the same for every option manager.
This commit is contained in:
parent
f5e4562bd9
commit
bfb116b8b4
|
@ -552,7 +552,7 @@ Completions CommandManager::complete(const Context& context,
|
||||||
case Token::Type::OptionExpand:
|
case Token::Type::OptionExpand:
|
||||||
{
|
{
|
||||||
Completions result(start , cursor_pos);
|
Completions result(start , cursor_pos);
|
||||||
result.candidates = context.options().complete_option_name(
|
result.candidates = GlobalScope::instance().option_registry().complete_option_name(
|
||||||
tokens[tok_idx].content(), cursor_pos_in_token);
|
tokens[tok_idx].content(), cursor_pos_in_token);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1009,11 +1009,8 @@ const CommandDesc set_option_cmd = {
|
||||||
return { 0_byte, params[0].length(),
|
return { 0_byte, params[0].length(),
|
||||||
complete(params[0], pos_in_token, scopes) };
|
complete(params[0], pos_in_token, scopes) };
|
||||||
else if (token_to_complete == 1)
|
else if (token_to_complete == 1)
|
||||||
{
|
|
||||||
OptionManager& options = get_scope(params[0], context).options();
|
|
||||||
return { 0_byte, params[1].length(),
|
return { 0_byte, params[1].length(),
|
||||||
options.complete_option_name(params[1], pos_in_token) };
|
GlobalScope::instance().option_registry().complete_option_name(params[1], pos_in_token) };
|
||||||
}
|
|
||||||
else if (token_to_complete == 2 and
|
else if (token_to_complete == 2 and
|
||||||
GlobalScope::instance().option_registry().option_exists(params[1]))
|
GlobalScope::instance().option_registry().option_exists(params[1]))
|
||||||
{
|
{
|
||||||
|
|
|
@ -76,35 +76,6 @@ const Option& OptionManager::operator[](StringView name) const
|
||||||
return const_cast<OptionManager&>(*this)[name];
|
return const_cast<OptionManager&>(*this)[name];
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatchingFunc>
|
|
||||||
CandidateList OptionManager::get_matching_names(MatchingFunc func)
|
|
||||||
{
|
|
||||||
CandidateList result;
|
|
||||||
if (m_parent)
|
|
||||||
result = m_parent->get_matching_names(func);
|
|
||||||
for (auto& option : m_options)
|
|
||||||
{
|
|
||||||
if (option->flags() & OptionFlags::Hidden)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const auto& name = option->name();
|
|
||||||
if (func(name) and not contains(result, name))
|
|
||||||
result.push_back(name);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
CandidateList OptionManager::complete_option_name(StringView prefix,
|
|
||||||
ByteCount cursor_pos)
|
|
||||||
{
|
|
||||||
using namespace std::placeholders;
|
|
||||||
auto real_prefix = prefix.substr(0, cursor_pos);
|
|
||||||
auto result = get_matching_names(std::bind(prefix_match, _1, real_prefix));
|
|
||||||
if (result.empty())
|
|
||||||
result = get_matching_names(std::bind(subsequence_match, _1, real_prefix));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
OptionManager::OptionList OptionManager::flatten_options() const
|
OptionManager::OptionList OptionManager::flatten_options() const
|
||||||
{
|
{
|
||||||
OptionList res = m_parent ? m_parent->flatten_options() : OptionList{};
|
OptionList res = m_parent ? m_parent->flatten_options() : OptionList{};
|
||||||
|
@ -130,4 +101,31 @@ void OptionManager::on_option_changed(const Option& option)
|
||||||
watcher->on_option_changed(option);
|
watcher->on_option_changed(option);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Container, typename MatchingFunc>
|
||||||
|
static CandidateList get_matching_names(const Container& options, MatchingFunc func)
|
||||||
|
{
|
||||||
|
CandidateList result;
|
||||||
|
for (auto& option : options)
|
||||||
|
{
|
||||||
|
if (option->flags() & OptionFlags::Hidden)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const auto& name = option->name();
|
||||||
|
if (func(name))
|
||||||
|
result.push_back(name);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
CandidateList OptionsRegistry::complete_option_name(StringView prefix,
|
||||||
|
ByteCount cursor_pos) const
|
||||||
|
{
|
||||||
|
using namespace std::placeholders;
|
||||||
|
auto real_prefix = prefix.substr(0, cursor_pos);
|
||||||
|
auto result = get_matching_names(m_descs, std::bind(prefix_match, _1, real_prefix));
|
||||||
|
if (result.empty())
|
||||||
|
result = get_matching_names(m_descs, std::bind(subsequence_match, _1, real_prefix));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,8 +83,6 @@ public:
|
||||||
const Option& operator[] (StringView name) const;
|
const Option& operator[] (StringView name) const;
|
||||||
Option& get_local_option(StringView name);
|
Option& get_local_option(StringView name);
|
||||||
|
|
||||||
CandidateList complete_option_name(StringView prefix,
|
|
||||||
ByteCount cursor_pos);
|
|
||||||
|
|
||||||
using OptionList = Vector<const Option*>;
|
using OptionList = Vector<const Option*>;
|
||||||
OptionList flatten_options() const;
|
OptionList flatten_options() const;
|
||||||
|
@ -100,9 +98,6 @@ private:
|
||||||
friend class Scope;
|
friend class Scope;
|
||||||
friend class OptionsRegistry;
|
friend class OptionsRegistry;
|
||||||
|
|
||||||
template<typename MatchingFunc>
|
|
||||||
CandidateList get_matching_names(MatchingFunc func);
|
|
||||||
|
|
||||||
Vector<std::unique_ptr<Option>, MemoryDomain::Options> m_options;
|
Vector<std::unique_ptr<Option>, MemoryDomain::Options> m_options;
|
||||||
OptionManager* m_parent;
|
OptionManager* m_parent;
|
||||||
|
|
||||||
|
@ -222,6 +217,8 @@ public:
|
||||||
return opt->name() == name;
|
return opt->name() == name;
|
||||||
}) != m_descs.end();
|
}) != m_descs.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CandidateList complete_option_name(StringView prefix, ByteCount cursor_pos) const;
|
||||||
private:
|
private:
|
||||||
OptionManager& m_global_manager;
|
OptionManager& m_global_manager;
|
||||||
Vector<std::unique_ptr<OptionDesc>, MemoryDomain::Options> m_descs;
|
Vector<std::unique_ptr<OptionDesc>, MemoryDomain::Options> m_descs;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user