#include "option_manager.hh" #include "assert.hh" #include "flags.hh" #include "scope.hh" namespace Kakoune { OptionDesc::OptionDesc(String name, String docstring, OptionFlags flags) : m_name(std::move(name)), m_docstring(std::move(docstring)), m_flags(flags) {} Option::Option(const OptionDesc& desc, OptionManager& manager) : m_manager(manager), m_desc(desc) {} OptionManager::OptionManager(OptionManager& parent) : m_parent(&parent) { parent.register_watcher(*this); } OptionManager::~OptionManager() { if (m_parent) m_parent->unregister_watcher(*this); kak_assert(m_watchers.empty()); } void OptionManager::reparent(OptionManager& parent) { if (m_parent) m_parent->unregister_watcher(*this); m_parent = &parent; parent.register_watcher(*this); } void OptionManager::register_watcher(OptionManagerWatcher& watcher) const { kak_assert(not contains(m_watchers, &watcher)); m_watchers.push_back(&watcher); } void OptionManager::unregister_watcher(OptionManagerWatcher& watcher) const { auto it = find(m_watchers.begin(), m_watchers.end(), &watcher); kak_assert(it != m_watchers.end()); m_watchers.erase(it); } struct option_not_found : public runtime_error { option_not_found(StringView name) : runtime_error(format("option not found: '{}'. Use declare-option first", name)) {} }; Option& OptionManager::get_local_option(StringView name) { auto it = m_options.find(name); if (it != m_options.end()) return *(it->value); else if (m_parent) { auto* clone = (*m_parent)[name].clone(*this); return *m_options.insert({clone->name(), std::unique_ptr