From ed60746355044dd39acd82b8f42c4d9886914567 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 2 Jun 2010 17:22:12 +0200 Subject: Implement generation of specifier functions (--generate-specifier) These functions determine whether the option was specified on the command line. New test: specifier. --- cli/name-processor.cxx | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'cli/name-processor.cxx') diff --git a/cli/name-processor.cxx b/cli/name-processor.cxx index 20e4b43..d846c7e 100644 --- a/cli/name-processor.cxx +++ b/cli/name-processor.cxx @@ -75,6 +75,28 @@ namespace name_set& set_; }; + struct intermediate_option: traversal::option, context + { + intermediate_option (context& c, name_set& set) + : context (c), set_ (set) + { + } + + virtual void + traverse (type& o) + { + if (specifier && o.type ().name () != "bool") + { + semantics::context& oc (o.context ()); + string const& base (oc.get ("name")); + oc.set ("specifier", find_name (base + "_specified", set_)); + } + } + + private: + name_set& set_; + }; + struct secondary_option: traversal::option, context { secondary_option (context& c, name_set& set) @@ -88,6 +110,12 @@ namespace semantics::context& oc (o.context ()); string const& base (oc.get ("name")); oc.set ("member", find_name (base + "_", set_)); + + if (specifier && o.type ().name () != "bool") + { + string const& base (oc.get ("specifier")); + oc.set ("specifier-member", find_name (base + "_", set_)); + } } private: @@ -117,7 +145,16 @@ namespace class_::names (c, names); } - // Then assign secondary names. + // Then assign intermediate names. + // + { + intermediate_option option (*this, member_set); + traversal::names names (option); + + class_::names (c, names); + } + + // Finally assign secondary names. // { secondary_option option (*this, member_set); -- cgit v1.1