aboutsummaryrefslogtreecommitdiff
path: root/xsde/cxx/hybrid/parser-header.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2009-03-26 17:09:53 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2009-03-26 17:09:53 +0200
commite4c22d3686da0e973e21eae0561c1169c0eeff36 (patch)
tree0a49e9167edc88938b0287949080931314e8afea /xsde/cxx/hybrid/parser-header.cxx
parent0d62005a3ff3b62d02c2eb3fd8644e0e19b202e8 (diff)
Implement support for XML Schema polymorphism in C++/Hybrid
examples/cxx/hybrid/polyroot/ examples/cxx/hybrid/polymorphism/: new examples tests/cxx/hybrid/polymorphism/: new tests
Diffstat (limited to 'xsde/cxx/hybrid/parser-header.cxx')
-rw-r--r--xsde/cxx/hybrid/parser-header.cxx35
1 files changed, 35 insertions, 0 deletions
diff --git a/xsde/cxx/hybrid/parser-header.cxx b/xsde/cxx/hybrid/parser-header.cxx
index 72cc2e3..6a893c5 100644
--- a/xsde/cxx/hybrid/parser-header.cxx
+++ b/xsde/cxx/hybrid/parser-header.cxx
@@ -347,6 +347,34 @@ namespace CXX
}
};
+ //
+ //
+ struct PostOverride: Traversal::Complex, Context
+ {
+ PostOverride (Context& c)
+ : Context (c)
+ {
+ }
+
+ virtual Void
+ traverse (SemanticGraph::Complex& c)
+ {
+ if (c.inherits_p ())
+ {
+ SemanticGraph::Type& b (c.inherits ().base ());
+
+ if (polymorphic (b))
+ {
+ if (tiein)
+ dispatch (b);
+
+ os << "virtual " << pret_type (b) << endl
+ << post_name (b) << " ();"
+ << endl;
+ }
+ }
+ }
+ };
//
//
@@ -354,6 +382,8 @@ namespace CXX
{
Complex (Context& c)
: Context (c),
+ post_override_ (c),
+
// State.
//
compositor_state_ (c),
@@ -472,6 +502,9 @@ namespace CXX
// post
//
+ if (polymorphic (c))
+ post_override_.dispatch (c);
+
os << "virtual " << ret << endl
<< post_name (c) << " ();"
<< endl;
@@ -546,6 +579,8 @@ namespace CXX
}
private:
+ PostOverride post_override_;
+
// State.
//
CompositorState compositor_state_;