aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-12-10 16:23:38 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-12-10 16:23:38 +0200
commite2eff99775d348fd11a59de0d3952d593dbaa65f (patch)
tree2dc1e48c8af031f31a9a259b1f505f5ac895f826
parent49c21e87117032b88574887c1e6cc862fcb288a2 (diff)
Use derived (variadic) return type in polymorphic type post_*() callbacks
We cannot use the base return type since it is not assigned (by the type processor) for types that are in included/imported schemas.
-rw-r--r--xsde/cxx/hybrid/parser-header.cxx33
-rw-r--r--xsde/cxx/hybrid/parser-source.cxx39
2 files changed, 31 insertions, 41 deletions
diff --git a/xsde/cxx/hybrid/parser-header.cxx b/xsde/cxx/hybrid/parser-header.cxx
index 340fd37..b950130 100644
--- a/xsde/cxx/hybrid/parser-header.cxx
+++ b/xsde/cxx/hybrid/parser-header.cxx
@@ -13,14 +13,10 @@ namespace CXX
{
namespace
{
- //
- //
struct PostOverride: Traversal::Complex, Context
{
- PostOverride (Context& c)
- : Context (c)
- {
- }
+ PostOverride (Context& c, SemanticGraph::Complex& scope)
+ : Context (c), scope_ (scope) {}
virtual void
traverse (SemanticGraph::Complex& c)
@@ -34,12 +30,18 @@ namespace CXX
if (tiein)
dispatch (b);
- os << "virtual " << pret_type (b) << endl
+ // Use variadic return type since base return type (pret_type)
+ // is not set for types in included/imported schemas.
+ //
+ os << "virtual " << pret_type (scope_) << endl
<< post_name (b) << " ();"
<< endl;
}
}
}
+
+ private:
+ SemanticGraph::Complex& scope_;
};
//
@@ -47,7 +49,7 @@ namespace CXX
struct Enumeration: Traversal::Enumeration, Context
{
Enumeration (Context& c, Traversal::Complex& complex)
- : Context (c), complex_ (complex), post_override_ (c)
+ : Context (c), complex_ (complex)
{
}
@@ -151,7 +153,10 @@ namespace CXX
String const& ret (pret_type (e));
if (polymorphic (e))
- post_override_.dispatch (e);
+ {
+ PostOverride po (*this, e);
+ po.dispatch (e);
+ }
os << "virtual " << ret << endl
<< post_name (e) << " ();"
@@ -221,7 +226,6 @@ namespace CXX
private:
Traversal::Complex& complex_;
- PostOverride post_override_;
};
struct List: Traversal::List, Context
@@ -566,8 +570,6 @@ namespace CXX
{
Complex (Context& c)
: Context (c),
- post_override_ (c),
-
// State.
//
compositor_state_ (c),
@@ -687,7 +689,10 @@ namespace CXX
// post
//
if (polymorphic (c))
- post_override_.dispatch (c);
+ {
+ PostOverride po (*this, c);
+ po.dispatch (c);
+ }
os << "virtual " << ret << endl
<< post_name (c) << " ();"
@@ -763,8 +768,6 @@ namespace CXX
}
private:
- PostOverride post_override_;
-
// State.
//
CompositorState compositor_state_;
diff --git a/xsde/cxx/hybrid/parser-source.cxx b/xsde/cxx/hybrid/parser-source.cxx
index ed68c4f..2cc4dfa 100644
--- a/xsde/cxx/hybrid/parser-source.cxx
+++ b/xsde/cxx/hybrid/parser-source.cxx
@@ -13,26 +13,14 @@ namespace CXX
{
namespace
{
- //
- //
struct PostOverride: Traversal::Complex, Context
{
- PostOverride (Context& c)
- : Context (c), scope_ (0)
- {
- }
+ PostOverride (Context& c, SemanticGraph::Complex& scope)
+ : Context (c), scope_ (scope) {}
virtual void
traverse (SemanticGraph::Complex& c)
{
- bool clear (false);
-
- if (scope_ == 0)
- {
- scope_ = &c;
- clear = true;
- }
-
if (c.inherits_p ())
{
SemanticGraph::Type& b (c.inherits ().base ());
@@ -42,22 +30,19 @@ namespace CXX
if (tiein)
dispatch (b);
- String const& scope (epimpl_custom (*scope_));
+ String const& scope (epimpl_custom (scope_));
- os << pret_type (b) << " " << scope << "::" << endl
+ os << pret_type (scope_) << " " << scope << "::" << endl
<< post_name (b) << " ()"
<< "{"
<< "return this->" << post_name (c) << " ();"
<< "}";
}
}
-
- if (clear)
- scope_ = 0;
}
private:
- SemanticGraph::Complex* scope_;
+ SemanticGraph::Complex& scope_;
};
//
@@ -89,7 +74,6 @@ namespace CXX
Enumeration (Context& c, Traversal::Complex& complex)
: Context (c),
complex_ (complex),
- post_override_ (c),
enumerator_ (c)
{
names_ >> enumerator_;
@@ -404,7 +388,10 @@ namespace CXX
String const& ret (pret_type (e));
if (polymorphic (e))
- post_override_.dispatch (e);
+ {
+ PostOverride po (*this, e);
+ po.dispatch (e);
+ }
os << ret << " " << name << "::" << endl
<< post_name (e) << " ()"
@@ -493,7 +480,6 @@ namespace CXX
private:
Traversal::Complex& complex_;
- PostOverride post_override_;
Traversal::Names names_;
Enumerator enumerator_;
@@ -1587,7 +1573,6 @@ namespace CXX
Complex (Context& c)
: Context (c),
base_name_ (c, TypeName::base),
- post_override_ (c),
compositor_callback_ (c),
particle_callback_ (c),
attribute_callback_ (c)
@@ -1984,7 +1969,10 @@ namespace CXX
// post
//
if (polymorphic (c))
- post_override_.dispatch (c);
+ {
+ PostOverride po (*this, c);
+ po.dispatch (c);
+ }
os << ret << " " << name << "::" << endl
<< post_name (c) << " ()"
@@ -2076,7 +2064,6 @@ namespace CXX
private:
TypeName base_name_;
- PostOverride post_override_;
CompositorCallback compositor_callback_;
ParticleCallback particle_callback_;