diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-01-22 15:40:12 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-01-22 15:40:12 +0200 |
commit | f60df03e3cedb86508645357e17003eb9281f31a (patch) | |
tree | d65c9cd62a6500b7d0f8303caf64797d08f508c0 /xsd/cxx/tree/name-processor.cxx | |
parent | 55ffb84acf75d3fa475dfe21d053e404eb753e5a (diff) |
Add support for detaching subtrees in C++/Tree
New option: --generate-detach. New test: cxx/tree/detach.
Diffstat (limited to 'xsd/cxx/tree/name-processor.cxx')
-rw-r--r-- | xsd/cxx/tree/name-processor.cxx | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/xsd/cxx/tree/name-processor.cxx b/xsd/cxx/tree/name-processor.cxx index 1949c5d..a9427a6 100644 --- a/xsd/cxx/tree/name-processor.cxx +++ b/xsd/cxx/tree/name-processor.cxx @@ -31,9 +31,6 @@ namespace CXX // typedef Cult::Containers::Set<String> NameSet; - - - class Context: public Tree::Context { public: @@ -57,6 +54,7 @@ namespace CXX 0), global_type_names (global_type_names_), global_element_names (global_element_names_), + detach (options.value<CLI::generate_detach> ()), type_regex (type_regex_), accessor_regex (accessor_regex_), one_accessor_regex (one_accessor_regex_), @@ -189,6 +187,7 @@ namespace CXX // modifier_regex.push_back ("/([^,]+),([^,]+)/set\\u$1\\u$2/"); modifier_regex.push_back ("/([^,]+)/set\\u$1/"); + modifier_regex.push_back ("/detach,([^,]+)/detach\\u$1/"); } compile_regex (options.value<CLI::modifier_regex> (), @@ -271,6 +270,7 @@ namespace CXX : Tree::Context (c), global_type_names (c.global_type_names), global_element_names (c.global_element_names), + detach (c.detach), type_regex (c.type_regex), accessor_regex (c.accessor_regex), one_accessor_regex (c.one_accessor_regex), @@ -537,6 +537,8 @@ namespace CXX Cult::Containers::Map<String, NameSet>& global_type_names; Cult::Containers::Map<String, NameSet>& global_element_names; + Boolean detach; + RegexVector& type_regex; RegexVector& accessor_regex; RegexVector& one_accessor_regex; @@ -670,8 +672,8 @@ namespace CXX Boolean def_attr (m.default_ () && m.is_a<SemanticGraph::Attribute> ()); - // Accessors/modifiers. Note that we postpone inserting the - // names into the name_set to avoid over-escaping. + // Accessors/modifiers. Note that we postpone inserting + // the names into the name_set to avoid over-escaping. // String an, mn; @@ -741,6 +743,19 @@ namespace CXX if (mn != b && mn != an) name_set_.insert (mn); + // Detach. + // + if (detach && max == 1 && (min == 1 || def_attr)) + { + String dn (find_name ( + escape (process_regex (L"detach," + s, + one_modifier_regex, + modifier_regex, + L"one modifier")), + name_set_)); + + m.context ().set ("dname", dn); + } // Types. // @@ -1281,21 +1296,21 @@ namespace CXX escape (process_regex (L"value,traits", type_regex, L"type")), set)); - String an = Context::find_name ( + String an (Context::find_name ( escape (process_regex ("value", one_accessor_regex, accessor_regex, L"one accessor")), set, - false); + false)); - String mn = Context::find_name ( + String mn (Context::find_name ( escape (process_regex ("value", one_modifier_regex, modifier_regex, L"one modifier")), set, - false); + false)); ec.set ("aname", an); ec.set ("mname", mn); @@ -1305,6 +1320,20 @@ namespace CXX if (an != mn) set.insert (mn); + // Detach. + // + if (detach) + { + String dn (Context::find_name ( + escape (process_regex (L"detach,value", + one_modifier_regex, + modifier_regex, + L"one modifier")), + set)); + + ec.set ("dname", dn); + } + // Assign name() and namespace_() names. // ec.set ( |