summaryrefslogtreecommitdiff
path: root/cli/name-processor.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-06-02 17:22:12 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-06-02 17:22:12 +0200
commited60746355044dd39acd82b8f42c4d9886914567 (patch)
treea958825cb9bca8960eafb41c373d91e22ca9e4ed /cli/name-processor.cxx
parent62166bfe7031522bd851eb5d7047a19182e24a45 (diff)
Implement generation of specifier functions (--generate-specifier)
These functions determine whether the option was specified on the command line. New test: specifier.
Diffstat (limited to 'cli/name-processor.cxx')
-rw-r--r--cli/name-processor.cxx39
1 files changed, 38 insertions, 1 deletions
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<string> ("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<string> ("name"));
oc.set ("member", find_name (base + "_", set_));
+
+ if (specifier && o.type ().name () != "bool")
+ {
+ string const& base (oc.get<string> ("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);