summaryrefslogtreecommitdiff
path: root/modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp')
-rw-r--r--modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp1136
1 files changed, 1136 insertions, 0 deletions
diff --git a/modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp b/modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp
new file mode 100644
index 00000000000..1f36dd99248
--- /dev/null
+++ b/modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp
@@ -0,0 +1,1136 @@
+// file : CIDLC/ExecImplSourceGenerator.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "ExecImplSourceGenerator.hpp"
+#include "CorbaTypeNameEmitters.hpp"
+#include "UtilityTypeNameEmitters.hpp"
+#include "ParameterEmitter_T.hpp"
+#include "AttributeSourceEmitters_T.hpp"
+#include "CompositionEmitter.hpp"
+#include "ModuleEmitter.hpp"
+#include "InterfaceEmitter.hpp"
+#include "Literals.hpp"
+
+#include <ostream>
+#include <sstream>
+
+#include "CCF/CodeGenerationKit/Regex.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+using namespace StringLiterals;
+
+namespace
+{
+ template <typename T>
+ struct OperationEmitter : Traversal::Operation, EmitterBase
+ {
+ OperationEmitter (Context& c, T& scope)
+ : EmitterBase (c),
+ scope_ (scope)
+ {}
+
+ virtual void
+ name (Type& o)
+ {
+ os << endl
+ << scope_.name () << "_exec_i::" << o.name ();
+ }
+
+ virtual void
+ receives_pre (Type&)
+ {
+ os << " (" << endl;
+ }
+
+ virtual void
+ receives_none (Type&)
+ {
+ os << " ()" << endl;
+ }
+
+ virtual void
+ receives_post (Type&)
+ {
+ os << endl << ")" << endl;
+ }
+
+ virtual void
+ raises_pre (Type&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ raises_none (Type&)
+ {
+ os << STRS[EXCP_SNGL];
+ }
+
+ virtual void
+ raises_post (Type&)
+ {
+ os << "))";
+ }
+
+ virtual void
+ post (Type& o)
+ {
+ os << "{"
+ << STRS[YCH] << endl;
+
+ Traversal::Operation operation_emitter;
+
+ Traversal::Belongs returns;
+ operation_emitter.edge_traverser (returns);
+
+ NullReturnEmitter return_emitter (ctx);
+ returns.node_traverser (return_emitter);
+
+ operation_emitter.traverse (o);
+
+ os << "}";
+ }
+
+ virtual void
+ comma (Type&)
+ {
+ os << "," << endl;
+ }
+
+ protected:
+ T& scope_;
+ };
+
+ struct FacetEmitter : Traversal::UnconstrainedInterface,
+ EmitterBase
+ {
+ FacetEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (UnconstrainedInterface& i)
+ {
+ if (i.context ().count ("facet_impl_src_gen")) return;
+
+ os << STRS[SEP] << endl
+ << "// Facet Executor Implementation Class: "
+ << i.name () << "_exec_i" << endl
+ << STRS[SEP] << endl << endl;
+
+ os << i.name () << "_exec_i::"
+ << i.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}"
+ << i.name () << "_exec_i::~"
+ << i.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}"
+ << "// Operations from " << i.scoped_name () << endl << endl;
+
+ {
+ InterfaceEmitter interface_emitter (ctx);
+
+ Traversal::Defines defines_;
+ Traversal::Inherits inherits_;
+ interface_emitter.edge_traverser (defines_);
+ interface_emitter.edge_traverser (inherits_);
+
+ bool exec_src = true;
+ AttributeSourceEmitter<UnconstrainedInterface> attribute_emitter (
+ ctx,
+ i,
+ exec_src
+ );
+ defines_.node_traverser (attribute_emitter);
+
+ OperationEmitter<UnconstrainedInterface> operation_emitter (ctx, i);
+ defines_.node_traverser (operation_emitter);
+ inherits_.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ bool for_exec_src = true;
+ ParameterEmitter<Traversal::InParameter> in_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::InOutParameter> inout_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::OutParameter> out_param (
+ ctx,
+ for_exec_src
+ );
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ inherits (i, inherits_);
+ names (i, defines_);
+ }
+
+ i.context ().set ("facet_impl_src_gen", true);
+ }
+ };
+
+ struct ExecPortsEmitter : Traversal::ConsumerData,
+ Traversal::ProviderData,
+ EmitterBase
+ {
+ ExecPortsEmitter (Context& c, SemanticGraph::Component& scope)
+ : EmitterBase (c),
+ enclosing_type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ type_name_emitter_ (c),
+ scope_ (scope)
+ {
+ enclosing_belongs_.node_traverser (enclosing_type_name_emitter_);
+ simple_belongs_.node_traverser (simple_type_name_emitter_);
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Provider& p)
+ {
+ Traversal::ProviderData::belongs (p, enclosing_belongs_);
+
+ os << "::CCM_";
+
+ Traversal::ProviderData::belongs (p, simple_belongs_);
+
+ os << "_ptr" << endl
+ << scope_.name () << "_exec_i::get_"
+ << p.name () << " ()" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << STRS[YCH] << endl
+ << "return ";
+
+ Traversal::ProviderData::belongs (p, enclosing_belongs_);
+
+ os << "::CCM_";
+
+ Traversal::ProviderData::belongs (p, simple_belongs_);
+
+ os << "::_nil ();" << endl
+ << "}";
+ }
+
+ virtual void
+ traverse (SemanticGraph::Consumer& c)
+ {
+ os << "void" << endl
+ << scope_.name () << "_exec_i::push_"
+ << c.name () << " (" << endl;
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << " * /* ev */" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << STRS[YCH] << endl
+ << "}";
+ }
+
+ private:
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs enclosing_belongs_;
+ Traversal::Belongs simple_belongs_;
+ Traversal::Belongs belongs_;
+ SemanticGraph::Component& scope_;
+ };
+
+ struct ComponentExecImplEmitter : Traversal::Component, EmitterBase
+ {
+ ComponentExecImplEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ pre (Type& t)
+ {
+ // Generate the facet executor class(es) first.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ Traversal::Provider provider;
+ defines.node_traverser (provider);
+
+ Traversal::Belongs belongs;
+ provider.edge_traverser (belongs);
+
+ FacetEmitter facet_emitter (ctx);
+ belongs.node_traverser (facet_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << STRS[SEP] << endl
+ << "// Component Executor Implementation Class: "
+ << t.name () << "_exec_i" << endl
+ << STRS[SEP] << endl << endl;
+
+ os << t.name () << "_exec_i::"
+ << t.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}"
+ << t.name () << "_exec_i::~"
+ << t.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}";
+
+ os << "// Supported or inherited operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Supports supports_;
+ component_emitter.edge_traverser (component_inherits);
+ component_emitter.edge_traverser (supports_);
+ InterfaceEmitter interface_emitter (ctx);
+ supports_.node_traverser (interface_emitter);
+
+ Traversal::Defines defines;
+ Traversal::Inherits interface_inherits;
+ interface_emitter.edge_traverser (defines);
+ interface_emitter.edge_traverser (interface_inherits);
+
+ bool exec_src = true;
+ AttributeSourceEmitter<SemanticGraph::Component> attribute_emitter (
+ ctx,
+ t,
+ exec_src
+ );
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter<SemanticGraph::Component> operation_emitter (ctx, t);
+ defines.node_traverser (operation_emitter);
+ interface_inherits.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ bool for_exec_src = true;
+ ParameterEmitter<Traversal::InParameter> in_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::InOutParameter> inout_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::OutParameter> out_param (
+ ctx,
+ for_exec_src
+ );
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Attribute operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ component_emitter.edge_traverser (component_inherits);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+
+ bool exec_src = true;
+ AttributeSourceEmitter<SemanticGraph::Component> attribute_emitter (
+ ctx,
+ t,
+ exec_src
+ );
+ defines.node_traverser (attribute_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Port operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ component_emitter.edge_traverser (component_inherits);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+
+ ExecPortsEmitter exec_ports_emitter (ctx, t);
+ defines.node_traverser (exec_ports_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Operations from Components::SessionComponent" << endl << endl;
+
+ os << "void" << endl
+ << t.name () << "_exec_i::set_session_context (" << endl
+ << STRS[COMP_SC] << "_ptr ctx" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << "this->context_ =" << endl
+ << " " << t.name () << "_Context::_narrow (" << endl
+ << " ctx" << endl
+ << " " <<");"
+ << endl;
+
+ os << "if (this->context_ == 0)" << endl
+ << "{"
+ << "throw ::CORBA::INTERNAL ();"
+ << "}"
+ << "}";
+
+ os << "void" << endl
+ << t.name () << "_exec_i::ciao_preactivate ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[YCH]
+ << "}";
+
+ os << "void" << endl
+ << t.name () << "_exec_i::ciao_postactivate ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[YCH]
+ << "}";
+
+ os << "void" << endl
+ << t.name () << "_exec_i::ccm_activate ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[YCH]
+ << "}";
+
+ os << "void" << endl
+ << t.name () << "_exec_i::ccm_passivate ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[YCH]
+ << "}";
+
+ os << "void" << endl
+ << t.name () << "_exec_i::ccm_remove ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[YCH]
+ << "}";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ }
+ };
+
+ // HomeFactory and HomeFinder are tied to Operation in
+ // the front end. Since we want to treat them differently
+ // than regular operations in a home (we want to generate
+ // base class factory operations returning the base component,
+ // for example), we use this class for regular home operations
+ // that overrides HomeFactory and HomeFinder traversals
+ // to do nothing.
+ struct HomeOperationEmitter : OperationEmitter<SemanticGraph::Home>,
+ Traversal::HomeFactory,
+ Traversal::HomeFinder
+ {
+ HomeOperationEmitter (Context& c, SemanticGraph::Home& scope)
+ : OperationEmitter<SemanticGraph::Home> (c, scope)
+ {}
+
+ virtual void
+ traverse (SemanticGraph::HomeFactory&)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::HomeFinder&)
+ {
+ }
+ };
+
+ struct FactoryOperationEmitter : Traversal::HomeFactory,
+ EmitterBase
+ {
+ FactoryOperationEmitter (Context& c, SemanticGraph::Home& scope)
+ : EmitterBase (c),
+ enclosing_type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ scope_ (scope)
+ {
+ enclosing_returns_.node_traverser (enclosing_type_name_emitter_);
+ simple_returns_.node_traverser (simple_type_name_emitter_);
+ }
+
+ virtual void
+ returns (SemanticGraph::HomeFactory&)
+ {
+ os << STRS[COMP_EC] << "_ptr" << endl;
+ }
+
+ virtual void
+ name (SemanticGraph::HomeFactory& hf)
+ {
+ os << scope_.name () << "_exec_i::" << hf.name ();
+ }
+
+ virtual void
+ receives_none (SemanticGraph::HomeFactory&)
+ {
+ os << " ()" << endl;
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::HomeFactory&)
+ {
+ os << " (" << endl;
+ }
+
+ virtual void
+ receives_post (SemanticGraph::HomeFactory&)
+ {
+ os << endl << ")" << endl;
+ }
+
+ virtual void
+ raises_none (SemanticGraph::HomeFactory&)
+ {
+ os << STRS[EXCP_SNGL];
+ }
+
+ virtual void
+ raises_pre (SemanticGraph::HomeFactory&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ raises_post (SemanticGraph::HomeFactory&)
+ {
+ os << "))";
+ }
+
+ virtual void
+ post (SemanticGraph::HomeFactory& hf)
+ {
+ os << "{"
+ << STRS[YCH] << endl
+ << "return ";
+
+ Traversal::HomeFactory::returns (hf, enclosing_returns_);
+
+ os << "::CCM_";
+
+ Traversal::HomeFactory::returns (hf, simple_returns_);
+
+ os << "::_nil ();"
+ << "}";
+ }
+
+ virtual void
+ comma (SemanticGraph::HomeFactory&)
+ {
+ os << "," << endl;
+ }
+
+ private:
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ Traversal::Returns enclosing_returns_;
+ Traversal::Returns simple_returns_;
+ SemanticGraph::Home& scope_;
+ };
+
+ struct FinderOperationEmitter : Traversal::HomeFinder,
+ EmitterBase
+ {
+ FinderOperationEmitter (Context& c, SemanticGraph::Home& scope)
+ : EmitterBase (c),
+ enclosing_type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ scope_ (scope)
+ {
+ enclosing_returns_.node_traverser (enclosing_type_name_emitter_);
+ simple_returns_.node_traverser (simple_type_name_emitter_);
+ }
+
+ virtual void
+ returns (SemanticGraph::HomeFinder&)
+ {
+ os << STRS[COMP_EC] << "_ptr" << endl;
+ }
+
+ virtual void
+ name (SemanticGraph::HomeFinder& hf)
+ {
+ os << scope_.name () << "_exec_i::" << hf.name ();
+ }
+
+ virtual void
+ receives_none (SemanticGraph::HomeFinder&)
+ {
+ os << " ()" << endl;
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::HomeFinder&)
+ {
+ os << " (" << endl;
+ }
+
+ virtual void
+ receives_post (SemanticGraph::HomeFinder&)
+ {
+ os << endl << ")" << endl;
+ }
+
+ virtual void
+ raises_none (SemanticGraph::HomeFinder&)
+ {
+ os << STRS[EXCP_SNGL];
+ }
+
+ virtual void
+ raises_pre (SemanticGraph::HomeFinder&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ raises_post (SemanticGraph::HomeFinder&)
+ {
+ os << "))";
+ }
+
+ virtual void
+ post (SemanticGraph::HomeFinder& hf)
+ {
+ os << "{"
+ << STRS[YCH] << endl
+ << "return ";
+
+ Traversal::HomeFinder::returns (hf, enclosing_returns_);
+
+ os << "::CCM_";
+
+ Traversal::HomeFinder::returns (hf, simple_returns_);
+
+ os << "::_nil ();"
+ << "}";
+ }
+
+ virtual void
+ comma (SemanticGraph::HomeFinder&)
+ {
+ os << "," << endl;
+ }
+
+ private:
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ Traversal::Returns enclosing_returns_;
+ Traversal::Returns simple_returns_;
+ SemanticGraph::Home& scope_;
+ };
+
+ struct HomeExecImplEmitter : Traversal::Home, EmitterBase
+ {
+ HomeExecImplEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ pre (Type& t)
+ {
+ os << STRS[SEP] << endl
+ << "// Home Executor Implementation Class: "
+ << t.name () << "_exec_i" << endl
+ << STRS[SEP] << endl << endl;
+
+ os << t.name () << "_exec_i::"
+ << t.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}"
+ << t.name () << "_exec_i::~"
+ << t.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}";
+
+ os << "// Supported or inherited operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ Traversal::Supports supports_;
+ home_emitter.edge_traverser (home_inherits);
+ home_emitter.edge_traverser (supports_);
+ InterfaceEmitter interface_emitter (ctx);
+ supports_.node_traverser (interface_emitter);
+
+ Traversal::Defines defines;
+ Traversal::Inherits interface_inherits;
+ interface_emitter.edge_traverser (defines);
+ interface_emitter.edge_traverser (interface_inherits);
+
+ bool exec_src = true;
+ AttributeSourceEmitter<SemanticGraph::Home> attribute_emitter (
+ ctx,
+ t,
+ exec_src
+ );
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter<SemanticGraph::Home> operation_emitter (ctx, t);
+ defines.node_traverser (operation_emitter);
+ interface_inherits.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ bool for_exec_src = true;
+ ParameterEmitter<Traversal::InParameter> in_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::InOutParameter> inout_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::OutParameter> out_param (
+ ctx,
+ for_exec_src
+ );
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Home operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+ home_emitter.edge_traverser (home_inherits);
+
+ HomeOperationEmitter home_operation_emitter (ctx, t);
+ defines.node_traverser (home_operation_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ home_operation_emitter.edge_traverser (receives);
+ home_operation_emitter.edge_traverser (returns);
+ home_operation_emitter.edge_traverser (raises);
+
+ bool for_exec_src = true;
+ ParameterEmitter<Traversal::InParameter> in_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::InOutParameter> inout_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::OutParameter> out_param (
+ ctx,
+ for_exec_src
+ );
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ // Generate home factory operations. This is a separate traversal
+ // stack because we want to generate the factory operations
+ // of ancestors with the return type of the base component.
+ os << "// Factory and finder operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits inherits;
+ home_emitter.edge_traverser (inherits);
+ inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+
+ FactoryOperationEmitter factory_operation_emitter (ctx, t);
+ FinderOperationEmitter finder_operation_emitter (ctx, t);
+ defines.node_traverser (factory_operation_emitter);
+ defines.node_traverser (finder_operation_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ factory_operation_emitter.edge_traverser (receives);
+ factory_operation_emitter.edge_traverser (returns);
+ factory_operation_emitter.edge_traverser (raises);
+ finder_operation_emitter.edge_traverser (receives);
+ finder_operation_emitter.edge_traverser (returns);
+ finder_operation_emitter.edge_traverser (raises);
+
+ bool for_exec_src = true;
+ ParameterEmitter<Traversal::InParameter> in_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::InOutParameter> inout_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::OutParameter> out_param (
+ ctx,
+ for_exec_src
+ );
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Attribute operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ home_emitter.edge_traverser (home_inherits);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+
+ bool exec_src = true;
+ AttributeSourceEmitter<SemanticGraph::Home> attribute_emitter (
+ ctx,
+ t,
+ exec_src
+ );
+ defines.node_traverser (attribute_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Implicit operations." << endl << endl
+ << STRS[COMP_EC] << "_ptr" << endl
+ << t.name () << "_exec_i::create ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[COMP_EC] << "_ptr retval =" << endl
+ << " " << STRS[COMP_EC] << "::_nil ();" << endl
+ << "ACE_NEW_THROW_EX (" << endl
+ << "retval," << endl;
+
+ Traversal::Home home_emitter;
+
+ Traversal::Manages manages_;
+ home_emitter.edge_traverser (manages_);
+
+ SimpleTypeNameEmitter manages_emitter (ctx);
+ manages_.node_traverser (manages_emitter);
+
+ home_emitter.traverse (t);
+
+ os << "_exec_i," << endl
+ << "::CORBA::NO_MEMORY ());"
+ << endl
+ << "return retval;"
+ << "}";
+ }
+
+ virtual void
+ post (Type& t)
+ {
+ // We need to escape C++ keywords before flattening the name.
+ //
+ string name;
+ {
+ std::ostringstream ostr;
+ ostr.pword (name_printer_index) = os.pword (name_printer_index);
+ ostr << t.scoped_name ();
+ name = regex::perl_s (ostr.str (), "/::/_/");
+ }
+
+ os << "extern \"C\" " << ctx.export_macro ()
+ << " ::Components::HomeExecutorBase_ptr" << endl
+ << "create" << name << "_Impl (void)" << endl
+ << "{"
+ << "::Components::HomeExecutorBase_ptr retval =" << endl
+ << " ::Components::HomeExecutorBase::_nil ();" << endl
+ << "ACE_NEW_RETURN (" << endl
+ << "retval," << endl
+ << t.name () << "_exec_i," << endl
+ << "::Components::HomeExecutorBase::_nil ());" << endl
+ << "return retval;"
+ << "}";
+ }
+ };
+}
+
+ExecImplSourceEmitter::ExecImplSourceEmitter (std::ostream& os_,
+ CommandLine const& cl,
+ string export_macro,
+ fs::path const& file)
+ : os (os_),
+ cl_ (cl),
+ export_macro_ (export_macro),
+ file_ (file)
+{}
+
+void
+ExecImplSourceEmitter::pre (TranslationUnit&)
+{
+ os << COPYRIGHT;
+
+ string file_name ("");
+
+ if (! file_.empty ())
+ {
+ file_name = file_.leaf ();
+ }
+
+ string file_suffix = cl_.get_value ("exec-hdr-file-suffix",
+ "_exec.h");
+
+ file_name = regex::perl_s (file_name,
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1"
+ + file_suffix
+ + "/");
+
+ os << "#include \"" << file_name << "\"" << endl
+ << "#include \"ciao/CIAO_common.h\"" << endl << endl;
+}
+
+void
+ExecImplSourceEmitter::generate (TranslationUnit& u)
+{
+ pre (u);
+
+ Context c (os, export_macro_, cl_);
+
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion principal_region;
+ contains_principal.node_traverser (principal_region);
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ principal_region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ contains_root.node_traverser (root);
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ ModuleEmitter module (c);
+ CompositionEmitter composition (c);
+ defines.node_traverser (module);
+ defines.node_traverser (composition);
+
+ // Layer 4
+ //
+ composition.edge_traverser (defines);
+ module.edge_traverser (defines);
+
+ //--
+ Traversal::ComponentExecutor component_executor;
+ Traversal::HomeExecutor home_executor;
+ defines.node_traverser (component_executor);
+ defines.node_traverser (home_executor);
+
+ // Layer 5
+ //
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+ home_executor.edge_traverser (implements);
+
+ //--
+ ComponentExecImplEmitter component_exec_impl_emitter (c);
+ HomeExecImplEmitter home_exec_impl_emitter (c);
+ implements.node_traverser (component_exec_impl_emitter);
+ implements.node_traverser (home_exec_impl_emitter);
+
+ unit.traverse (u);
+
+ post (u);
+}
+
+void
+ExecImplSourceEmitter::post (TranslationUnit&)
+{
+}
+