#pragma once #include #include #include #include "argtype_registry.h" #include "katom.h" #include "option_set.h" class Option_set_registry { public: // Parse and register an "@@name.o : @@" // declaration. The name is passed in because the caller has already // split it from its ".o" target suffix in order to route here. void add(const Argtype_registry& argtypes, const std::string& name, katom_iter begin, katom_iter end, katom_list& katoms); bool has(const std::string& name) const; const Option_set& get(const std::string& name, const Locator& loc) const; void add_user(const std::string& set_name, const std::string& klammer_name); // `defined_outside`: list only sets declared in a file not in the list -- // the input's own, with the loaded klammersets' left out. See // Klammer::defined_outside. std::string describe(int margin = 2, const strings_t& defined_outside = {}) const; // "a, b, c" -- the sets that exist, for a diagnostic about one that does not. std::string available() const; std::map m_option_sets {}; std::vector m_names {}; }; // What one parameter inherited from an option set: which set it came from, // and whether its default was overridden where the set was used. Default // resolution has three levels -- argument type, option set, use site -- and // kdesc says which one a klammer's effective default came from, so the level // has to be recorded rather than inferred from the value. struct Option_set_use { std::string m_set {}; bool m_overridden {}; }; // parameter name -> where it came from using option_set_uses_t = std::map; // Replace every option-set use in a parameter list with the parameters it // stands for. Any other klammer application in a parameter list is an // error: an option set is the only construct that may put parameters there, // and only in a ".k" declaration. // // `parameters` is modified in place. Sets are recorded as used by // `klammer_name`, so `option_sets` is not const. option_set_uses_t expand_option_sets( katom_list& parameters, const std::string& klammer_name, const std::string& target_name, Option_set_registry& option_sets); // Record on each parameter that came from a set which set it came from and // whether its default was overridden. Called after the expanded parameter // list has been parsed. void stamp_option_set_uses(Parameter_set& parameters, const option_set_uses_t& uses);