summaryrefslogtreecommitdiff
path: root/xsd/cxx/tree/elements.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'xsd/cxx/tree/elements.cxx')
-rw-r--r--xsd/cxx/tree/elements.cxx32
1 files changed, 29 insertions, 3 deletions
diff --git a/xsd/cxx/tree/elements.cxx b/xsd/cxx/tree/elements.cxx
index 503ca72..76a7f9f 100644
--- a/xsd/cxx/tree/elements.cxx
+++ b/xsd/cxx/tree/elements.cxx
@@ -678,7 +678,9 @@ namespace CXX
//
GenerateFromBaseCtor::
GenerateFromBaseCtor (Context& c, Boolean& generate)
- : traverser_ (c, generate)
+ : generate_ (generate),
+ custom_ (false),
+ traverser_ (c, generate, custom_)
{
inherits_ >> traverser_;
}
@@ -687,23 +689,47 @@ namespace CXX
traverse (SemanticGraph::Complex& c)
{
inherits (c, inherits_);
+
+ if (!generate_ && custom_)
+ {
+ // We have a customized type in the hierarchy. In this case we
+ // want to generate the c-tor unless base and ultimate-base are
+ // the same (see CtorArgs).
+ //
+ SemanticGraph::Type& b (c.inherits ().base ());
+ generate_ = b.is_a<SemanticGraph::Complex> () &&
+ !b.is_a<SemanticGraph::Enumeration> ();
+ }
}
GenerateFromBaseCtor::Traverser::
- Traverser (Context& c, Boolean& generate)
- : Context (c), generate_ (generate)
+ Traverser (Context& c, Boolean& generate, Boolean& custom)
+ : Context (c), generate_ (generate), custom_ (custom)
{
*this >> inherits_ >> *this;
*this >> names_ >> *this;
}
Void GenerateFromBaseCtor::Traverser::
+ traverse (SemanticGraph::Type& t)
+ {
+ if (!custom_)
+ {
+ String tmp;
+ custom_ = custom_type (t, tmp);
+ }
+ }
+
+ Void GenerateFromBaseCtor::Traverser::
traverse (SemanticGraph::Complex& c)
{
names (c, names_);
if (!generate_)
inherits (c, inherits_);
+
+ if (!generate_)
+ traverse (static_cast<SemanticGraph::Type&> (c));
}
Void GenerateFromBaseCtor::Traverser::