diff options
author | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2004-01-05 07:53:05 +0000 |
---|---|---|
committer | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2004-01-05 07:53:05 +0000 |
commit | 416e681ee818f12c486c5ed60734036d8f7eec91 (patch) | |
tree | d63db847f2b8407413b6165608c861fea47c7fb2 /TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp | |
parent | f26eb3eeba79d666cc711f82b55cd1df73ab8edc (diff) | |
download | ATCD-416e681ee818f12c486c5ed60734036d8f7eec91.tar.gz |
ChangeLogTag: Mon Jan 5 01:44:13 2004 Jeff Parsons <j.parsons@vanderbilt.edu>
Diffstat (limited to 'TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp')
-rw-r--r-- | TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp | 2713 |
1 files changed, 1561 insertions, 1152 deletions
diff --git a/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp b/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp index 6ebc4d7aa0c..08e999570b4 100644 --- a/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp +++ b/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp @@ -3,24 +3,23 @@ // cvs-id : $Id$ #include "ServantHeaderGenerator.hpp" - -#include "Literals.hpp" #include "TypeNameEmitter.hpp" +#include "Literals.hpp" + +#include <ostream> #include "CCF/CodeGenerationKit/Regex.hpp" -#include <cctype> -#include <algorithm> -#include <ostream> +using std::endl; +using std::string; using namespace StringLiterals; -using namespace CCF; -using namespace CIDL; -using namespace SyntaxTree; +using namespace CCF::CIDL; +using namespace CCF::CIDL::SemanticGraph; namespace { - // On some platforms toupper can be something else than a + // On some platforms toupper can be something other than a // function. int upcase (int c) @@ -31,282 +30,309 @@ namespace namespace { - // Generates parts of the accessor operation for an attribute. - // - // - class GetAttributeEmitter : public HeaderEmitterBase, - public Traversal::AttributeDecl + class Context { public: - GetAttributeEmitter (ostream& os_, - ReturnTypeNameEmitter* return_type_name_emitter) - : HeaderEmitterBase (os_), - AttributeDecl (return_type_name_emitter) + Context (std::ostream& os, + string export_macro) + : os_ (os), + export_macro_ (export_macro) { } - - virtual void - pre (AttributeDeclPtr const&) - { - os << "virtual "; - } - - virtual void - post (AttributeDeclPtr const& a) - { - os << endl - << a->name ().simple () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - } + + std::ostream& + os () + { + return os_; + } + + string + export_macro () + { + return export_macro_; + } + + private: + std::ostream& os_; + string export_macro_; }; - - - // Generates parts of the mutator operation for an attribute. - // - // - class SetAttributeEmitter : public HeaderEmitterBase, - public Traversal::AttributeDecl + class EmitterBase { public: - SetAttributeEmitter (ostream& os_, - INArgTypeNameEmitter* param_type_name_emitter) - : HeaderEmitterBase (os_), - AttributeDecl (param_type_name_emitter) + EmitterBase (Context& c) + : ctx (c), + os (ctx.os ()) { } - virtual void - pre (AttributeDeclPtr const& a) - { - os << "virtual void " << endl - << a->name ().simple () << " (" << endl; - } - - virtual void - post (AttributeDeclPtr const&) - { - os << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - } + protected: + Context& ctx; + std::ostream& os; }; - - // - // - // - class OperationEmitter : public HeaderEmitterBase, - public Traversal::UnconstrainedInterfaceDef, - public Traversal::OperationParameter, - public Traversal::Comma, - public Traversal::OperationDecl + + struct OperationEmitter : Traversal::Operation, EmitterBase { - public: - OperationEmitter (ostream& os_, - ReturnTypeNameEmitter* return_type_name_emitter, - INArgTypeNameEmitter* inarg_type_name_emitter_, - OUTArgTypeNameEmitter* outarg_type_name_emitter_, - INOUTArgTypeNameEmitter* inoutarg_type_name_emitter_) - : HeaderEmitterBase (os_), - OperationParameter (inarg_type_name_emitter_, - outarg_type_name_emitter_, - inoutarg_type_name_emitter_), - OperationDecl (return_type_name_emitter) - { - } - + OperationEmitter (Context& c) + : EmitterBase (c) + {} + virtual void - pre (OperationDeclPtr const&) + pre (Type&) { os << "virtual "; } virtual void - name (OperationDeclPtr const& d) + name (Type& o) { - os << endl << d->name ().simple () << " ("; + os << endl << o.name (); } virtual void - pre (OperationParameterPtr const&) + receives_pre (Type&) { - os << endl; + os << " (" << endl; } virtual void - post (OperationParameterPtr const& op) + receives_none (Type&) { - os << " " << op->name (); + os << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl; } virtual void - traverse (CommaPtr const&) + receives_post (Type&) { - os << ","; + os << endl << STRS[ENV_HDR] << ")" << endl; } virtual void - post (OperationDeclPtr const& d) - { - // @@@ (JP) Need to process exception list. - os << endl - << (d->begin () == d->end () ? STRS[ENV_SNGL_HDR] : STRS[ENV_HDR]) - << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - } - }; - - // Generates the operation associated with a home factory declaration. - // - // - class FactoryEmitter : public HeaderEmitterBase, - public Traversal::HomeFactoryDecl, - public Traversal::OperationParameter, - public Traversal::Comma - { - public: - FactoryEmitter (ostream& os_, - INArgTypeNameEmitter* inarg_type_name_emitter_) - : HeaderEmitterBase (os_), - OperationParameter (inarg_type_name_emitter_, - inarg_type_name_emitter_, - inarg_type_name_emitter_) + raises_pre (Type&) { + os << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl; } virtual void - pre (HomeFactoryDeclPtr const&) + raises_none (Type&) { - os << "virtual "; + os << STRS[EXCP_SNGL]; } virtual void - type (HomeFactoryDeclPtr const& f) + raises_post (Type&) { - HomeDefPtr def (f->scope ()->dynamic_type<SyntaxTree::HomeDef> ()); - os << def->manages ()->name () << "_ptr"; + os << "))"; } virtual void - name (HomeFactoryDeclPtr const& f) + post (Type&) { - os << endl - << f->name ().simple () << " ("; + os << ";" << endl << endl; } virtual void - pre (OperationParameterPtr const&) + comma (Type&) { - os << endl; + os << "," << endl; } + }; + // For generating parameter names. + template <typename T> + struct ParameterEmitter : T + { + ParameterEmitter (std::ostream& os_) + : os (os_) + {} + virtual void - post (OperationParameterPtr const& op) + name (typename T::Type& p) { - os << " " << op->name (); + os << " " << p.name (); } + + private: + std::ostream& os; + }; + // Generic scoped typename emitter used by various other emitters. + struct TypeNameEmitter : Traversal::Type + { + TypeNameEmitter (std::ostream& os_) + : os (os_) + {} + virtual void - traverse (CommaPtr const&) + traverse (SemanticGraph::Type& t) { - os << ","; + os << t.scoped_name (); } + + private: + std::ostream& os; + }; + // Generic local typename emitter used by various other emitters. + struct SimpleTypeNameEmitter : Traversal::Type + { + SimpleTypeNameEmitter (std::ostream& os_) + : os (os_) + {} + virtual void - post (HomeFactoryDeclPtr const& f) + traverse (SemanticGraph::Type& t) { - // @@@ (JP) Need to process exception list. - os << (f->begin () == f->end () ? STRS[ENV_SNGL_HDR] : STRS[ENV_HDR]) - << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + os << t.name (); } + + private: + std::ostream& os; }; - - // - // Select only the facets that are present in a provides declaration. - // - class FacetSelector : public HeaderEmitterBase, - public Traversal::UnconstrainedInterfaceDef + // Generate name of type's enclosing scope. + struct EnclosingTypeNameEmitter : Traversal::Type { - private: - Declarations const& declarations_; - - public: - FacetSelector (ostream& os_, Declarations const& declarations) - : HeaderEmitterBase (os_), - declarations_ (declarations) + EnclosingTypeNameEmitter (std::ostream& os_) + : os (os_) + {} + + virtual void + traverse (SemanticGraph::Type& t) { + os << t.scoped_name ().scope_name (); } + + private: + std::ostream& os; + }; - void - traverse (UnconstrainedInterfaceDefPtr const& i) + // Emits typename minus the leading double colon. + struct StrippedTypeNameEmitter : Traversal::Type + { + StrippedTypeNameEmitter (std::ostream& os_) + : os (os_) + {} + + virtual void + traverse (SemanticGraph::Type& t) { - if (declarations_.find (i)) - { - Traversal::UnconstrainedInterfaceDef::traverse (i); - } + ScopedName scoped (t.scoped_name ()); + Name stripped (scoped.begin () + 1, scoped.end ()); + os << stripped; } + + private: + std::ostream& os; }; - - // - // FacetEmitter generates a facet servant class declaration. - // - class FacetEmitter : public HeaderEmitterBase, - public Traversal::UnconstrainedInterfaceDef, - public Traversal::AttributeDecl //@@ Will disappear + struct FacetEmitter : Traversal::ProviderData, + EmitterBase { - private: - string export_macro_; - - public: - FacetEmitter (ostream& os_, - string export_macro) - : HeaderEmitterBase (os_), - export_macro_ (export_macro) + FacetEmitter (Context& c) + : EmitterBase (c), + simple_type_name_emitter_ (c.os ()), + stripped_type_name_emitter_ (c.os ()), + enclosing_type_name_emitter_ (c.os ()) { + simple_belongs_.node_traverser (simple_type_name_emitter_); + stripped_belongs_.node_traverser (stripped_type_name_emitter_); + enclosing_belongs_.node_traverser (enclosing_type_name_emitter_); } virtual void - pre (UnconstrainedInterfaceDefPtr const& i) - { - // If we are at file scope, we create a namespace anyway. - if (i->scope ()->dynamic_type<IDL2::SyntaxTree::FileScope> () != 0) - { - os << STRS[GLUE_NS] << endl - << "{"; - } - - // @@@ (JP) Need export macro and prefixable scoped name. - os << "class " << export_macro_ << " " << i->name ().simple () - << "_Servant" << endl - << ": public virtual POA_" << i->name ().in_file_scope () - << "," << endl + traverse (SemanticGraph::Provider& p) + { + // Open a namespace. + os << STRS[GLUE_NS] + << regex::perl_s (p.scoped_name ().scope_name ().scope_name ().str (), + "/::/_/") + << "{"; + + os << "class " << ctx.export_macro () << " "; + + Traversal::ProviderData::belongs (p, simple_belongs_); + + os << "_Servant" << endl + << ": public virtual POA_"; + + Traversal::ProviderData::belongs (p, stripped_belongs_); + + os << "," << endl << STRS[INH_RCSB] << endl << "{" << "public:" << endl; - os << i->name ().simple () << "_Servant (" << endl - << i->name ().scope () << "::CCM_" << i->name ().simple () - << "_ptr executor," << endl - << "::Components::CCMContext_ptr ctx);" << endl << endl; - - os << "virtual ~" << i->name ().simple () << "_Servant (void);" - << endl << endl; - } - - virtual void - traverse (AttributeDeclPtr const&) - { - // TODO - } + Traversal::ProviderData::belongs (p, simple_belongs_); + + os << "_Servant (" << endl; + + Traversal::ProviderData::belongs (p, enclosing_belongs_); + + os << "::CCM_"; + + Traversal::ProviderData::belongs (p, simple_belongs_); + + os << "_ptr executor," << endl + << "::Components::CCMContext_ptr ctx);" << endl; + + os << "virtual ~"; + + Traversal::ProviderData::belongs (p, simple_belongs_); + + os << "_Servant (void);" << endl; + + { + Traversal::Belongs belongs_; + Traversal::Interface interface_emitter; + belongs_.node_traverser (interface_emitter); + + Traversal::Defines defines; + Traversal::Inherits inherits; + interface_emitter.edge_traverser (defines); + interface_emitter.edge_traverser (inherits); + + OperationEmitter operation_emitter (ctx); + 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); + + ParameterEmitter<Traversal::InParameter> in_param (os); + ParameterEmitter<Traversal::InOutParameter> inout_param (os); + ParameterEmitter<Traversal::OutParameter> out_param (os); + receives.node_traverser (in_param); + receives.node_traverser (inout_param); + receives.node_traverser (out_param); + + ReturnTypeNameEmitter return_type_emitter (os); + TypeNameEmitter type_name_emitter (os); + 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 (os); + INOUTArgTypeNameEmitter inout_arg_emitter (os); + OUTArgTypeNameEmitter out_arg_emitter (os); + in_belongs.node_traverser (in_arg_emitter); + inout_belongs.node_traverser (inout_arg_emitter); + out_belongs.node_traverser (out_arg_emitter); + + belongs (p, belongs_); + } - virtual void - post (UnconstrainedInterfaceDefPtr const& i) - { os << "// Get component implementation." << endl << "virtual CORBA::Object_ptr" << endl << "_get_component (" << endl @@ -314,959 +340,1325 @@ namespace << STRS[EXCP_SNGL] << ";" << endl; os << "protected:" << endl - << "// Facet executor." << endl - << i->name ().scope () << "::CCM_" << i->name ().simple () - << "_var executor_;" << endl; - - os << "// Context object." << endl - << "::Components::CCMContext_var ctx_;" << endl - << "};" << endl << endl; - - // Close the CIAO_GLUE namespace, if we opened one. - if (i->scope ()->dynamic_type<IDL2::SyntaxTree::FileScope> () != 0) - { - os << "}" << endl; - } - - os << endl; + << "// Facet executor." << endl; + + Traversal::ProviderData::belongs (p, enclosing_belongs_); + + os << "::CCM_"; + + Traversal::ProviderData::belongs (p, simple_belongs_); + + os << "_var executor_;" << endl; + + os << "// Context object." << endl + << "::Components::CCMContext_var ctx_;" << endl + << "};" << endl << endl; + + // Close the CIAO_GLUE namespace. + os << "}" << endl; } + + private: + SimpleTypeNameEmitter simple_type_name_emitter_; + StrippedTypeNameEmitter stripped_type_name_emitter_; + EnclosingTypeNameEmitter enclosing_type_name_emitter_; + Traversal::Belongs simple_belongs_; + Traversal::Belongs stripped_belongs_; + Traversal::Belongs enclosing_belongs_; }; - // - // Generates public part of component context interface declaration. - // - class ContextPublicEmitter : public HeaderEmitterBase, - public Traversal::ComponentDef, - public Traversal::UsesDecl, - public Traversal::PublishesDecl, - public Traversal::EmitsDecl + // Generates operations associated with attributes. + // @@@ (JP) Need to support exceptions. + struct AttributeEmitter : Traversal::ReadWriteAttribute, + EmitterBase { - private: - string export_macro_; - Declarations const& declarations_; + AttributeEmitter (Context& c) + : EmitterBase (c), + write_type_name_emitter_ (c.os ()), + read_type_name_emitter_ (c.os ()) + { + write_belongs_.node_traverser (write_type_name_emitter_); + read_belongs_.node_traverser (read_type_name_emitter_); + } + + virtual void traverse (SemanticGraph::ReadWriteAttribute& a) + { + os << "virtual "; + + Traversal::ReadWriteAttribute::belongs (a, read_belongs_); + + os << endl + << a.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; - public: - ContextPublicEmitter (ostream& os_, - string export_macro, - Declarations const& declarations) - : HeaderEmitterBase (os_), - export_macro_ (export_macro), - declarations_ (declarations) + os << "virtual void" << endl + << a.name () << " (" << endl; + + Traversal::ReadWriteAttribute::belongs (a, write_belongs_); + + os << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; + } + + private: + INArgTypeNameEmitter write_type_name_emitter_; + ReturnTypeNameEmitter read_type_name_emitter_; + Traversal::Belongs write_belongs_; + Traversal::Belongs read_belongs_; + }; + + // Generates operations associated with readonly attributes. + // @@@ (JP) Need to support exceptions. + struct ReadOnlyAttributeEmitter : Traversal::ReadAttribute, + EmitterBase + { + ReadOnlyAttributeEmitter (Context& c) + : EmitterBase (c), + read_type_name_emitter_ (c.os ()) { + read_belongs_.node_traverser (read_type_name_emitter_); } - virtual void - traverse (ComponentDefPtr const& c) + virtual void traverse (SemanticGraph::ReadAttribute& a) { - if (declarations_.find (c)) + os << "virtual "; + + Traversal::ReadAttribute::belongs (a, read_belongs_); + + os << endl + << a.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; + } + + private: + ReturnTypeNameEmitter read_type_name_emitter_; + Traversal::Belongs read_belongs_; + }; + + struct ContextEmitter : Traversal::Component, EmitterBase + { + ContextEmitter (Context& c) + : EmitterBase (c) + {} + + // Nested classes used by this emitter. + private: + struct PortsEmitterPublic : Traversal::EmitterData, + Traversal::UserData, + Traversal::PublisherData, + EmitterBase + { + PortsEmitterPublic (Context& c) + : EmitterBase (c), + type_name_emitter_ (c.os ()) { - Traversal::ComponentDef::traverse (c); + belongs_.node_traverser (type_name_emitter_); } - } + + virtual void + traverse (SemanticGraph::Emitter& e) + { + os << "virtual void" << endl + << "push_" << e.name () + << " (" << endl; + + Traversal::EmitterData::belongs (e, belongs_); + + os << "ev" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl; + } + + virtual void + traverse (SemanticGraph::User& u) + { + // @@@ (JP) Need to handle multiple connections. + os << "virtual "; + + Traversal::UserData::belongs (u, belongs_); + + os << endl + << "get_connection_" << u.name () + << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl; + } + + virtual void + traverse (SemanticGraph::Publisher& p) + { + os << "virtual void" << endl + << "push_" << p.name () + << " (" << endl; + + Traversal::PublisherData::belongs (p, belongs_); + + os << "ev" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl; + } + + private: + INArgTypeNameEmitter type_name_emitter_; + Traversal::Belongs belongs_; + }; + + struct PortsEmitterProtected : Traversal::EmitterData, + Traversal::UserData, + Traversal::PublisherData, + EmitterBase + { + PortsEmitterProtected (Context& c) + : EmitterBase (c), + type_name_emitter_ (c.os ()) + { + belongs_.node_traverser (type_name_emitter_); + } + + virtual void + traverse (SemanticGraph::Emitter& e) + { + os << "virtual void" << endl + << "connect_" << e.name () << " (" << endl; + + Traversal::EmitterData::belongs (e, belongs_); + + os << "Consumer_ptr c" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_AC] << "));" << endl << endl; + + os << "virtual "; + + Traversal::EmitterData::belongs (e, belongs_); + + os << "Consumer_ptr" << endl + << "disconnect_" << e.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_NC] << "));" << endl; + } + + virtual void + traverse (SemanticGraph::User& u) + { + // @@@ (JP) Need to handle multiple connections. + os << "virtual void" << endl + << "connect_" << u.name () << " (" << endl; + + Traversal::UserData::belongs (u, belongs_); + + os << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_AC] << "," << endl + << STRS[EXCP_IC] << "));" << endl << endl; + + os << "virtual "; + + Traversal::UserData::belongs (u, belongs_); + + os << endl + << "disconnect_" << u.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_NC] << "));" << endl << endl; + } + + virtual void + traverse (SemanticGraph::Publisher& p) + { + os << "virtual " << STRS[COMP_CK] << " *" << endl + << "subscribe_" << p.name () << " (" << endl; + + Traversal::PublisherData::belongs (p, belongs_); + + os << "Consumer_ptr c" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_ECL] << "));" << endl << endl; + + os << "virtual "; + + Traversal::PublisherData::belongs (p, belongs_); + + os << "Consumer_ptr" << endl + << "unsubscribe_" << p.name () << " (" << endl + << STRS[COMP_CK] << " *ck" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IC] << "));" << endl << endl; + } + + private: + TypeNameEmitter type_name_emitter_; + Traversal::Belongs belongs_; + }; + + struct PortsEmitterMembers : Traversal::EmitterData, + Traversal::UserData, + Traversal::PublisherData, + EmitterBase + { + PortsEmitterMembers (Context& c) + : EmitterBase (c), + type_name_emitter_ (c.os ()) + { + belongs_.node_traverser (type_name_emitter_); + } + + virtual void + traverse (SemanticGraph::Emitter& e) + { + Traversal::EmitterData::belongs (e, belongs_); + os << "Consumer_var" << endl + << "ciao_emits_" << e.name () << "_consumer_;" + << endl << endl; + } + + virtual void + traverse (SemanticGraph::User& u) + { + // @@@ (JP) Need to handle multiple connections. + os << "// Simplex " << u.name () << " connection." << endl; + + Traversal::UserData::belongs (u, belongs_); + + os << "_var" << endl + << "ciao_uses_" << u.name () << "_;" << endl << endl; + } + + virtual void + traverse (SemanticGraph::Publisher& p) + { + os << "ACE_Active_Map_Manager<" << endl; + + Traversal::PublisherData::belongs (p, belongs_); + + os << "Consumer_var>" << endl + << "ciao_publishes_" << p.name () << "_map_;" + << endl << endl; + } + + private: + TypeNameEmitter type_name_emitter_; + Traversal::Belongs belongs_; + }; + + public: virtual void - pre (ComponentDefPtr const& c) + pre (Type& t) { - // If we are at file scope, we create a namespace anyway. - if (c->scope ()->dynamic_type<IDL2::SyntaxTree::FileScope> () != 0) + // CIAO has facet classes outside the context and servant classes. + // We launch it here to generate the classes at the top of the file, + // like the original hand-crafted examples, for easier checking. + // This can be moved later to ServantEmitter::pre() or out on its own. { - os << STRS[GLUE_NS] << endl - << "{"; + Traversal::Defines defines; + FacetEmitter facet_emitter (ctx); + defines.node_traverser (facet_emitter); + + names (t, defines); } - - os << "class " << export_macro_ << " " << c->name ().simple () - << "_Context" << endl - << ": public virtual " << c->name ().scope () << "::CCM_" - << c->name ().simple () << "_Context," - << endl - << "public virtual TAO_Local_RefCounted_Object" - << endl - << "{" - << "public:" << endl; + + os << STRS[GLUE_NS] + << regex::perl_s (t.scoped_name ().scope_name ().str (), "/::/_/") + << "{"; + + os << "class " << ctx.export_macro () << " " << t.name () + << "_Context" << endl + << ": public virtual " << t.scoped_name ().scope_name () << "::CCM_" + << t.name () << "_Context," + << endl + << "public virtual TAO_Local_RefCounted_Object" + << endl + << "{" + << "public:" << endl; os << "// We will allow the servant glue code we generate to " - << "access our state." << endl - << "friend class " << c->name ().simple () << "_Servant;" - << endl; + << "access our state." << endl + << "friend class " << t.name () << "_Servant;" + << endl; - os << c->name ().simple () << "_Context (" << endl - << "::Components::CCMHome_ptr home," << endl - << "::CIAO::Session_Container *c," << endl - << c->name ().simple () << "_Servant *sv);" << endl; + os << t.name () << "_Context (" << endl + << "::Components::CCMHome_ptr home," << endl + << "::CIAO::Session_Container *c," << endl + << t.name () << "_Servant *sv);" << endl; - os << "virtual ~" << c->name ().simple () << "_Context (void);" - << endl; + os << "virtual ~" << t.name () << "_Context (void);" + << endl; os << "// Operations from ::Components::CCMContext." << endl << endl; os << "virtual ::Components::Principal_ptr" << endl - << "get_caller_principal (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl; + << "get_caller_principal (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl; os << "virtual ::Components::CCMHome_ptr" << endl - << "get_CCM_home (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl ; + << "get_CCM_home (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl ; os << "virtual CORBA::Boolean" << endl - << "get_rollback_only (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IS] << "));" << endl; + << "get_rollback_only (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IS] << "));" << endl; os << "virtual ::Components::Transaction::UserTransaction_ptr" << endl - << "get_user_transaction (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IS] << "));" << endl; + << "get_user_transaction (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IS] << "));" << endl; os << "virtual CORBA::Boolean" << endl - << "is_caller_in_role (" << endl - << "const char *role" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl; + << "is_caller_in_role (" << endl + << "const char *role" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl; os << "virtual void" << endl - << "set_rollback_only (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IS] << "));" << endl; + << "set_rollback_only (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IS] << "));" << endl; os << "// Operations from ::Components::SessionContext interface." - << endl << endl; + << endl << endl; os << "virtual CORBA::Object_ptr" << endl - << "get_CCM_object (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IS] << "));" << endl; - - os << "// Operations for " << c->name ().simple () << " receptacles" - << " and event sources," << endl - << "// defined in " << c->name ().scope () << "::CCM_" - << c->name ().simple () << "_Context." - << endl << endl; - } - - virtual void - traverse (UsesDeclPtr const& d) - { - // @@@ (JP) Need to handle multiple connections. - os << "virtual " << d->type ()->name () << "_ptr" << endl - << "get_connection_" << d->name ().simple () - << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl; - } - - virtual void - traverse (PublishesDeclPtr const& d) - { - os << "virtual void" << endl - << "push_" << d->name ().simple () - << " (" << endl - << d->type ()->name () << " *ev" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - } - - virtual void - traverse (EmitsDeclPtr const& d) - { - os << "virtual void" << endl - << "push_" << d->name ().simple () - << " (" << endl - << d->type ()->name () << " *ev" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - } - }; - - // - // Generates protected methods of component context interface declaration. - // - class ContextProtectedMethodEmitter - : public HeaderEmitterBase, - public Traversal::ComponentDef, - public Traversal::UsesDecl, - public Traversal::PublishesDecl, - public Traversal::EmitsDecl - { - private: - Declarations const& declarations_; - - public: - ContextProtectedMethodEmitter (ostream& os_, - Declarations const& declarations) - : HeaderEmitterBase (os_), - declarations_ (declarations) - { - } - - virtual void - traverse (ComponentDefPtr const& c) - { - if (declarations_.find (c)) - { - Traversal::ComponentDef::traverse (c); + << "get_CCM_object (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IS] << "));" << endl; + + os << "// Operations for " << t.name () << " receptacles" + << " and event sources," << endl + << "// defined in " << t.scoped_name ().scope_name () << "::CCM_" + << t.name () << "_Context." + << endl << endl; + + { + Traversal::Defines defines; + PortsEmitterPublic ports_emitter (ctx); + defines.node_traverser (ports_emitter); + + names (t, defines); } - } - - virtual void - pre (ComponentDefPtr const& c) - { + os << "protected:" << endl << "// Methods that manage this component's connections" << " and consumers." << endl << endl; - } - virtual void - traverse (UsesDeclPtr const& d) - { - // @@@ (JP) Need to handle multiple connections. - os << "virtual void" << endl - << "connect_" << d->name ().simple () << " (" << endl - << d->type ()->name () << "_ptr" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_AC] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; + { + Traversal::Defines defines; + PortsEmitterProtected ports_emitter (ctx); + defines.node_traverser (ports_emitter); + + names (t, defines); + } + + os << "protected:" << endl; - os << "virtual " << d->type ()->name () << "_ptr" << endl - << "disconnect_" << d->name ().simple () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_NC] << "));" << endl << endl; + { + Traversal::Defines defines; + PortsEmitterMembers ports_emitter (ctx); + defines.node_traverser (ports_emitter); + + names (t, defines); + } } virtual void - traverse (EmitsDeclPtr const& d) + post (Type& t) { - os << "virtual void" << endl - << "connect_" << d->name ().simple () << " (" << endl - << d->type ()->name () << "Consumer_ptr c" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_AC] << "));" << endl << endl; - - os << "virtual " << d->type ()->name () << "Consumer_ptr" << endl - << "disconnect_" << d->name ().simple () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_NC] << "));" << endl; - } + os << "::Components::CCMHome_var home_;" << endl << endl + << "::CIAO::Session_Container *container_;" << endl << endl + << t.name () << "_Servant *servant_;" << endl << endl + << t.scoped_name () << "_var component_;" << endl << endl; - virtual void - traverse (PublishesDeclPtr const& p) - { - os << "virtual " << STRS[COMP_CK] << " *" << endl - << "subscribe_" << p->name ().simple () << " (" << endl - << p->type ()->name () << "Consumer_ptr c" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_ECL] << "));" << endl << endl; + // Component context class closer. + os << "};" << endl; - os << "virtual " << p->type ()->name () << "Consumer_ptr" << endl - << "unsubscribe_" << p->name ().simple () << " (" << endl - << STRS[COMP_CK] << " *ck" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; + // Namespace closer. + os << "}" << endl; } }; - - // - // Generates protected members of component context interface declaration. - // - class ContextProtectedMemberEmitter - : public HeaderEmitterBase, - public Traversal::ComponentDef, - public Traversal::UsesDecl, - public Traversal::PublishesDecl, - public Traversal::EmitsDecl + + struct InterfaceEmitter : Traversal::UnconstrainedInterface, + EmitterBase { - private: - Declarations const& declarations_; - public: - ContextProtectedMemberEmitter (ostream& os_, - Declarations const& declarations) - : HeaderEmitterBase (os_), - declarations_ (declarations) - { - } - - virtual void - traverse (ComponentDefPtr const& c) - { - if (declarations_.find (c)) - { - Traversal::ComponentDef::traverse (c); - } - } - - virtual void - pre (ComponentDefPtr const& c) - { - os << "protected:" << endl; - } + InterfaceEmitter (Context& c) + : EmitterBase (c) + {} - virtual void - traverse (UsesDeclPtr const& d) + bool + add (UnconstrainedInterface& i) { - // @@@ (JP) Need to handle multiple connections. - os << "// Simplex " << d->name ().simple () << " connection." << endl - << d->type ()->name () << "_var" << endl - << "ciao_uses_" << d->name ().simple () << "_;" << endl << endl; + return interfaces_.insert (&i).second; } virtual void - traverse (EmitsDeclPtr const& d) + traverse (UnconstrainedInterface& i) { - os << d->type ()->name () << "Consumer_var" << endl - << "ciao_emits_" << d->name ().simple () << "_consumer_;" - << endl << endl; - } - - virtual void - traverse (PublishesDeclPtr const& p) - { - os << "ACE_Active_Map_Manager<" << endl - << p->type ()->name () << "Consumer_var>" << endl - << "ciao_publishes_" << p->name ().simple () << "_map_;" - << endl << endl; - } - - virtual void - post (ComponentDefPtr const& c) - { - os << "::Components::CCMHome_var" << endl - << "home_;" << endl << endl; - - os << "::CIAO::Session_Container *" << endl - << "container_;" << endl << endl; - - os << c->name ().simple () << "_Servant *" << endl - << "servant_;" << endl << endl; - - os << c->name () << "_var" << endl - << "component_;" << endl << endl; - - os << "};" << endl; - - // Close the CIAO_GLUE namespace, if we opened one. - if (c->scope ()->dynamic_type<IDL2::SyntaxTree::FileScope> () != 0) + if (add (i)) { - os << "}" << endl; + Traversal::UnconstrainedInterface::traverse (i); } - - os << endl; } + + private: + std::set<UnconstrainedInterface*> interfaces_; }; - - - // - // Generates public part of component servant interface declaration. - // - class ServantPublicEmitter : public HeaderEmitterBase, - public Traversal::ComponentDef, - public Traversal::ProvidesDecl, - public Traversal::UsesDecl, - public Traversal::PublishesDecl, - public Traversal::ConsumesDecl, - public Traversal::EmitsDecl + struct ServantEmitter : Traversal::Component, EmitterBase { + ServantEmitter (Context& c) + : EmitterBase (c) + {} + + // Nested classes used by this emitter. private: - string export_macro_; - Declarations const& declarations_; - - OperationEmitter& operation_emitter_; - - public: - ServantPublicEmitter (ostream& os_, - string export_macro, - Declarations const& declarations, - OperationEmitter& operation_emitter) - : HeaderEmitterBase (os_), - export_macro_ (export_macro), - declarations_ (declarations), - operation_emitter_ (operation_emitter) - { - } - - virtual void - traverse (ComponentDefPtr const& c) + struct PortsEmitterPublic : Traversal::EmitterData, + Traversal::UserData, + Traversal::PublisherData, + Traversal::ConsumerData, + Traversal::ProviderData, + EmitterBase + { + PortsEmitterPublic (Context& c) + : EmitterBase (c), + type_name_emitter_ (c.os ()), + simple_type_name_emitter_ (c.os ()), + stripped_type_name_emitter_ (c.os ()) + { + belongs_.node_traverser (type_name_emitter_); + simple_belongs_.node_traverser (simple_type_name_emitter_); + stripped_belongs_.node_traverser (stripped_type_name_emitter_); + } + + virtual void + traverse (SemanticGraph::Provider& p) + { + os << "virtual "; + + Traversal::ProviderData::belongs (p, belongs_); + + os << "_ptr" << endl + << "provide_" << p.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; + } + + virtual void + traverse (SemanticGraph::User& u) + { + // @@@ (JP) Need to handle multiple connections. + os << "virtual void" << endl + << "connect_" << u.name () << " (" << endl; + + Traversal::UserData::belongs (u, belongs_); + + os << "_ptr c" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_AC] << "," << endl + << STRS[EXCP_IC] << "));" << endl << endl; + + os << "virtual "; + + Traversal::UserData::belongs (u, belongs_); + + os << "_ptr" << endl + << "disconnect_" << u.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_NC] << "));" << endl << endl; + + os << "virtual "; + + Traversal::UserData::belongs (u, belongs_); + + os << "_ptr" << endl + << "get_connection_" << u.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; + } + + virtual void + traverse (SemanticGraph::Consumer& c) + { + os << "// Servant class for the " << c.name () + << " consumer." << endl + << "class " << ctx.export_macro () << " "; + + Traversal::ConsumerData::belongs (c, simple_belongs_); + + os << "Consumer_" + << c.name () << "_Servant" << endl + << ": public virtual POA_"; + + Traversal::ConsumerData::belongs (c, stripped_belongs_); + + os << "Consumer," << endl + << STRS[INH_RCSB] << endl + << "{" + << "public:" << endl; + + Traversal::ConsumerData::belongs (c, simple_belongs_); + + os << "Consumer_" << c.name () << "_Servant (" << endl + << c.scoped_name ().scope_name ().scope_name () << "::CCM_" + << c.scoped_name ().scope_name ().simple_name () << "_ptr executor," + << endl + << c.scoped_name ().scope_name ().scope_name () << "::CCM_" + << c.scoped_name ().scope_name ().simple_name () + << "_Context_ptr c);" << endl << endl; + + os << "virtual ~"; + + Traversal::ConsumerData::belongs (c, simple_belongs_); + + os << "Consumer_" + << c.name () << "_Servant (void);" << endl << endl; + + // @@@ (JP) May need to generate this for the eventtype's ancestors + // as well (the spec is vague on this point). If so, we need the + // CIDL compiler to support valuetype/eventtype inheritance. + os << "virtual void" << endl + << "push_"; + + Traversal::ConsumerData::belongs (c, simple_belongs_); + + os << " (" << endl; + + Traversal::ConsumerData::belongs (c, belongs_); + + os << " *evt" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; + + os << "// Inherited from " << STRS[COMP_ECB] << "." << endl + << "virtual void" << endl + << "push_event (::Components::EventBase *ev" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_BET] << "));" << endl << endl; + + os << "// Get component implementation." << endl + << "virtual CORBA::Object_ptr" << endl + << "_get_component (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; + + os << "protected:" << endl + << c.scoped_name ().scope_name ().scope_name () << "::CCM_" + << c.scoped_name ().scope_name ().simple_name () + << "_var" << endl + << "executor_;" << endl << endl; + + os << c.scoped_name ().scope_name ().scope_name () << "::CCM_" + << c.scoped_name ().scope_name ().simple_name () + << "_Context_var" << endl + << "ctx_;" << endl; + + os << "};" << endl << endl; + + os << "virtual "; + + Traversal::ConsumerData::belongs (c, belongs_); + + os << "Consumer_ptr" << endl + << "get_consumer_" << c.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; + } + + virtual void + traverse (SemanticGraph::Emitter& e) + { + os << "virtual void" << endl + << "connect_" << e.name () << " (" << endl; + + Traversal::EmitterData::belongs (e, belongs_); + + os << "Consumer_ptr c" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_AC] << "));" << endl << endl; + + os << "virtual "; + + Traversal::EmitterData::belongs (e, belongs_); + + os << "Consumer_ptr" << endl + << "disconnect_" << e.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_NC] << "));" << endl << endl; + } + + virtual void + traverse (SemanticGraph::Publisher& p) + { + os << "virtual " << STRS[COMP_CK] << " *" << endl + << "subscribe_" << p.name () << " (" << endl; + + Traversal::PublisherData::belongs (p, belongs_); + + os << "Consumer_ptr c" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_ECL] << "));" << endl << endl; + + os << "virtual "; + + Traversal::PublisherData::belongs (p, belongs_); + + os << "Consumer_ptr" << endl + << "unsubscribe_" << p.name () << " (" << endl + << STRS[COMP_CK] << " *ck" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IC] << "));" << endl << endl; + } + + private: + TypeNameEmitter type_name_emitter_; + SimpleTypeNameEmitter simple_type_name_emitter_; + StrippedTypeNameEmitter stripped_type_name_emitter_; + Traversal::Belongs belongs_; + Traversal::Belongs simple_belongs_; + Traversal::Belongs stripped_belongs_; + }; + + struct PortsEmitterProtected : Traversal::ConsumerData, + Traversal::ProviderData, + EmitterBase { - if (declarations_.find (c)) + PortsEmitterProtected (Context& c) + : EmitterBase (c), + type_name_emitter_ (c.os ()) { - Traversal::ComponentDef::traverse (c); + belongs_.node_traverser (type_name_emitter_); + } + + virtual void + traverse (SemanticGraph::Provider& p) + { + Traversal::ProviderData::belongs (p, belongs_); + + os << "_var" << endl + << "provide_" << p.name () << "_;" << endl; } - } - virtual void - pre (ComponentDefPtr const& c) - { - // If we are at file scope, we create a namespace anyway. - if (c->scope ()->dynamic_type<IDL2::SyntaxTree::FileScope> () != 0) + virtual void + traverse (SemanticGraph::Consumer& c) { - os << STRS[GLUE_NS] << endl - << "{"; + Traversal::ConsumerData::belongs (c, belongs_); + + os << "Consumer_var" << endl + << "consumes_" << c.name () << "_;" << endl; } - // @@@ (JP) Need export macro and prefixable scoped name. - os << "class " << export_macro_ << " " << c->name ().simple () + private: + TypeNameEmitter type_name_emitter_; + Traversal::Belongs belongs_; + }; + + public: + virtual void + pre (Type& t) + { + os << STRS[GLUE_NS] + << regex::perl_s (t.scoped_name ().scope_name ().str (), "/::/_/") + << "{"; + + ScopedName scoped (t.scoped_name ()); + Name stripped (scoped.begin () + 1, scoped.end ()); + + os << "class " << ctx.export_macro () << " " << t.name () << "_Servant" << endl - << ": public virtual POA_" << c->name ().in_file_scope () - << "," << endl + << ": public virtual POA_" << stripped << "," << endl << STRS[INH_RCSB] << endl << "{" << "public:" << endl; - os << c->name ().simple () << "_Servant (" << endl - << c->name ().scope () << "::CCM_" << c->name ().simple () + os << t.name () << "_Servant (" << endl + << t.scoped_name ().scope_name () << "::CCM_" << t.name () << "_ptr executor," << endl << "::Components::CCMHome_ptr home," << endl << "::CIAO::Session_Container *c);" << endl << endl; - os << "virtual ~" << c->name ().simple () << "_Servant (void);" + os << "virtual ~" << t.name () << "_Servant (void);" << endl << endl; - - // @@@ (JP) Must include ancestors' supported interfaces as well. - for (SyntaxTree::ComponentDef::Iterator i = c->supports_begin (); - i != c->supports_end (); - i++) + + os << "// Supported operations." << endl << endl; + + // Generate operations for all supported interfaces. { - operation_emitter_.dispatch (i->resolve ()); + Traversal::Supports supports_; + InterfaceEmitter interface_emitter (ctx); + supports_.node_traverser (interface_emitter); + + Traversal::Defines defines; + Traversal::Inherits inherits; + interface_emitter.edge_traverser (defines); + interface_emitter.edge_traverser (inherits); + + OperationEmitter operation_emitter (ctx); + 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); + + ParameterEmitter<Traversal::InParameter> in_param (os); + ParameterEmitter<Traversal::InOutParameter> inout_param (os); + ParameterEmitter<Traversal::OutParameter> out_param (os); + receives.node_traverser (in_param); + receives.node_traverser (inout_param); + receives.node_traverser (out_param); + + ReturnTypeNameEmitter return_type_emitter (os); + TypeNameEmitter type_name_emitter (os); + 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 (os); + INOUTArgTypeNameEmitter inout_arg_emitter (os); + OUTArgTypeNameEmitter out_arg_emitter (os); + in_belongs.node_traverser (in_arg_emitter); + inout_belongs.node_traverser (inout_arg_emitter); + out_belongs.node_traverser (out_arg_emitter); + + supports (t, supports_); + } + + os << "// Public port operations." << endl << endl; + + // Generate public operations for ports, and nested classes for + // event consumers. + { + Traversal::Defines defines; + PortsEmitterPublic ports_emitter (ctx); + defines.node_traverser (ports_emitter); + + names (t, defines); + } + + // Generate operations for component attributes. + os << "// Component attribute operations." << endl << endl; + + { + Traversal::Defines defines; + AttributeEmitter attribute_emitter (ctx); + ReadOnlyAttributeEmitter read_only_attribute_emitter (ctx); + defines.node_traverser (attribute_emitter); + defines.node_traverser (read_only_attribute_emitter); + + names (t, defines); } - } - - virtual void - traverse (ProvidesDeclPtr const& p) - { - os << "virtual " << p->type ()->name () << "_ptr" << endl - << "provide_" << p->name ().simple () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - } - - virtual void - traverse (UsesDeclPtr const& p) - { - // @@@ (JP) Need to handle multiple connections. - os << "virtual void" << endl - << "connect_" << p->name ().simple () << " (" << endl - << p->type ()->name () << "_ptr c" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_AC] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - - os << "virtual " << p->type ()->name () << "_ptr" << endl - << "disconnect_" << p->name ().simple () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_NC] << "));" << endl << endl; - - os << "virtual " << p->type ()->name () << "_ptr" << endl - << "get_connection_" << p->name ().simple () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - } - - virtual void - traverse (ConsumesDeclPtr const& c) - { - // @@@ (JP) Need export macro. - os << "// Servant class for the " << c->name ().simple () - << " consumer." << endl - << "class " << export_macro_ << " " - << c->type ()->name ().simple () << "Consumer_" - << c->name ().simple () << "_Servant" << endl - << ": public virtual POA_" << c->type ()->name ().in_file_scope () - << "Consumer," << endl - << STRS[INH_RCSB] - << endl - << "{" - << "public:" << endl; - - os << c->type ()->name ().simple () << "Consumer_" << c->name ().simple () - << "_Servant (" << endl - << c->scope ()->name ().scope () << "::CCM_" - << c->scope ()->name ().simple () << "_ptr executor," - << endl - << c->scope ()->name ().scope () << "::CCM_" - << c->scope ()->name ().simple () - << "_Context_ptr c);" << endl << endl; - - os << "virtual ~" << c->type ()->name ().simple () << "Consumer_" - << c->name ().simple () << "_Servant (void);" << endl << endl; - - // @@@ (JP) May need to generate this for the eventtype's ancestors - // as well (the spec is vague on this point). If so, we need the - // CIDL compiler to support valuetype/eventtype inheritance. - os << "virtual void" << endl - << "push_" << c->type ()->name ().simple () << " (" << endl - << c->type ()->name () << " *evt" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - - os << "// Inherited from " << STRS[COMP_ECB] << "." << endl - << "virtual void" << endl - << "push_event (::Components::EventBase *ev" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_BET] << "));" << endl << endl; - - os << "// Get component implementation." << endl - << "virtual CORBA::Object_ptr" << endl - << "_get_component (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - - os << "protected:" << endl - << c->scope ()->name ().scope () << "::CCM_" - << c->scope ()->name ().simple () - << "_var" << endl - << "executor_;" << endl << endl; - - os << c->scope ()->name ().scope () << "::CCM_" - << c->scope ()->name ().simple () - << "_Context_var" << endl - << "ctx_;" << endl; - - os << "};" << endl << endl; - - os << "virtual " << c->type ()->name () << "Consumer_ptr" << endl - << "get_consumer_" << c->name ().simple () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - } - - virtual void - traverse (EmitsDeclPtr const& e) - { - os << "virtual void" << endl - << "connect_" << e->name ().simple () << " (" << endl - << e->type ()->name () << "Consumer_ptr c" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_AC] << "));" << endl << endl; - - os << "virtual " << e->type ()->name () << "Consumer_ptr" << endl - << "disconnect_" << e->name ().simple () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_NC] << "));" << endl << endl; - } - - virtual void - traverse (PublishesDeclPtr const& p) - { - os << "virtual " << STRS[COMP_CK] << " *" << endl - << "subscribe_" << p->name ().simple () << " (" << endl - << p->type ()->name () << "Consumer_ptr c" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_ECL] << "));" << endl << endl; - - os << "virtual " << p->type ()->name () << "Consumer_ptr" << endl - << "unsubscribe_" << p->name ().simple () << " (" << endl - << STRS[COMP_CK] << " *ck" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - } - virtual void - post (ComponentDefPtr const& c) - { os << "// Operations for Navigation interface." << endl << endl; os << "virtual CORBA::Object_ptr" << endl - << "provide_facet (" << endl - << "const char *name" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "));" << endl << endl; + << "provide_facet (" << endl + << "const char *name" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "));" << endl << endl; os << "virtual ::Components::FacetDescriptions *" << endl - << "get_all_facets (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "get_all_facets (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "virtual ::Components::FacetDescriptions *" << endl - << "get_named_facets (" << endl - << "const " << STRS[COMP_NAMES] << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "));" << endl << endl; + << "get_named_facets (" << endl + << "const " << STRS[COMP_NAMES] << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "));" << endl << endl; os << "virtual CORBA::Boolean" << endl - << "same_component (" << endl - << "CORBA::Object_ptr object_ref" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "same_component (" << endl + << "CORBA::Object_ptr object_ref" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "// Operations for Receptacles interface." << endl << endl; os << "virtual " << STRS[COMP_CK] << " *" << endl - << "connect (" << endl - << "const char *name," << endl - << "CORBA::Object_ptr connection" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_IC] << "," << endl - << STRS[EXCP_AC] << "," << endl - << STRS[EXCP_ECL] << "));" << endl << endl; + << "connect (" << endl + << "const char *name," << endl + << "CORBA::Object_ptr connection" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "," << endl + << STRS[EXCP_IC] << "," << endl + << STRS[EXCP_AC] << "," << endl + << STRS[EXCP_ECL] << "));" << endl << endl; os << "virtual CORBA::Object_ptr" << endl - << "disconnect (" << endl - << "const char *name," << endl - << STRS[COMP_CK] << " *ck" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_IC] << "," << endl - << STRS[EXCP_CR] << "," << endl - << STRS[EXCP_NC] << "));" << endl << endl; + << "disconnect (" << endl + << "const char *name," << endl + << STRS[COMP_CK] << " *ck" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "," << endl + << STRS[EXCP_IC] << "," << endl + << STRS[EXCP_CR] << "," << endl + << STRS[EXCP_NC] << "));" << endl << endl; os << "virtual ::Components::ConnectionDescriptions *" << endl - << "get_connections (" << endl - << "const char *name" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "));" << endl << endl; + << "get_connections (" << endl + << "const char *name" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "));" << endl << endl; os << "virtual ::Components::ReceptacleDescriptions *" << endl - << "get_all_receptacles (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "get_all_receptacles (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "virtual ::Components::ReceptacleDescriptions *" << endl - << "get_named_receptacles (" << endl - << "const " << STRS[COMP_NAMES] << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "));" << endl << endl; + << "get_named_receptacles (" << endl + << "const " << STRS[COMP_NAMES] << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "));" << endl << endl; os << "// Operations for Events interface." << endl << endl; os << "virtual " << STRS[COMP_ECB] << "_ptr" << endl - << "get_consumer (" << endl - << "const char *sink_name" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "));" << endl << endl; + << "get_consumer (" << endl + << "const char *sink_name" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "));" << endl << endl; os << "virtual " << STRS[COMP_CK] << " *" << endl - << "subscribe (" << endl - << "const char *publisher_name," << endl - << STRS[COMP_ECB] << "_ptr subscriber" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_IC] << "," << endl - << STRS[EXCP_ECL] << "));" << endl << endl; + << "subscribe (" << endl + << "const char *publisher_name," << endl + << STRS[COMP_ECB] << "_ptr subscriber" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "," << endl + << STRS[EXCP_IC] << "," << endl + << STRS[EXCP_ECL] << "));" << endl << endl; os << "virtual " << STRS[COMP_ECB] << "_ptr" << endl - << "unsubscribe (" << endl - << "const char *publisher_name," << endl - << STRS[COMP_CK] << " *ck" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; + << "unsubscribe (" << endl + << "const char *publisher_name," << endl + << STRS[COMP_CK] << " *ck" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "," << endl + << STRS[EXCP_IC] << "));" << endl << endl; os << "virtual void" << endl - << "connect_consumer (" << endl - << "const char *emitter_name," << endl - << STRS[COMP_ECB] << "_ptr consumer" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_AC] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; + << "connect_consumer (" << endl + << "const char *emitter_name," << endl + << STRS[COMP_ECB] << "_ptr consumer" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "," << endl + << STRS[EXCP_AC] << "," << endl + << STRS[EXCP_IC] << "));" << endl << endl; os << "virtual " << STRS[COMP_ECB] << "_ptr" << endl - << "disconnect_consumer (" << endl - << "const char *source_name" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_NC] << "));" << endl << endl; + << "disconnect_consumer (" << endl + << "const char *source_name" << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "," << endl + << STRS[EXCP_NC] << "));" << endl << endl; os << "virtual ::Components::ConsumerDescriptions *" << endl - << "get_all_consumers (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "get_all_consumers (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "virtual ::Components::ConsumerDescriptions *" << endl - << "get_named_consumers (" << endl - << "const " << STRS[COMP_NAMES] << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "));" << endl << endl; + << "get_named_consumers (" << endl + << "const " << STRS[COMP_NAMES] << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "));" << endl << endl; os << "virtual ::Components::EmitterDescriptions *" << endl - << "get_all_emitters (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "get_all_emitters (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "virtual ::Components::EmitterDescriptions *" << endl - << "get_named_emitters(" << endl - << "const " << STRS[COMP_NAMES] << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "));" << endl << endl; + << "get_named_emitters(" << endl + << "const " << STRS[COMP_NAMES] << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "));" << endl << endl; os << "virtual ::Components::PublisherDescriptions *" << endl - << "get_all_publishers (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "get_all_publishers (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "virtual ::Components::PublisherDescriptions *" << endl - << "get_named_publishers(" << endl - << "const " << STRS[COMP_NAMES] << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "));" << endl << endl; + << "get_named_publishers(" << endl + << "const " << STRS[COMP_NAMES] << endl + << STRS[ENV_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_IN] << "));" << endl << endl; os << "// Operations for CCMObject interface." << endl << endl; os << "virtual CORBA::IRObject_ptr" << endl - << "get_component_def (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "get_component_def (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "virtual ::Components::CCMHome_ptr" << endl - << "get_ccm_home (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "get_ccm_home (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "virtual ::Components::PrimaryKeyBase *" << endl - << "get_primary_key (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_NKA] << "));" << endl << endl; + << "get_primary_key (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_NKA] << "));" << endl << endl; os << "virtual void" << endl - << "configuration_complete (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_ICF] << "));" << endl << endl; + << "configuration_complete (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_ICF] << "));" << endl << endl; os << "virtual void" << endl - << "remove (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_RF] << "));" << endl << endl; + << "remove (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl + << STRS[EXCP_RF] << "));" << endl << endl; os << "virtual ::Components::ComponentPortDescription *" << endl - << "get_all_ports(" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "get_all_ports(" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "// Get component implementation." << endl - << "virtual CORBA::Object_ptr" << endl - << "_get_component (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "virtual CORBA::Object_ptr" << endl + << "_get_component (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "// CIAO-specific operations." << endl << endl; os << "void" << endl - << "_ciao_activate (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + << "_ciao_activate (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "void" << endl - << "_ciao_passivate (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - } - }; - - // - // Generates public part of component servant interface declaration. - // - class ServantProtectedEmitter : public HeaderEmitterBase, - public Traversal::ComponentDef, - public Traversal::ProvidesDecl, - public Traversal::ConsumesDecl - { - private: - Declarations const& declarations_; - - public: - ServantProtectedEmitter (ostream& os_, - Declarations const& declarations) - : HeaderEmitterBase (os_), - declarations_ (declarations) - { - } + << "_ciao_passivate (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl + << STRS[EXCP_SNGL] << ";" << endl << endl; - virtual void - traverse (ComponentDefPtr const& c) - { - if (declarations_.find (c)) - { - Traversal::ComponentDef::traverse (c); - } - } - - virtual void - pre (ComponentDefPtr const& c) - { os << "protected:" << endl - << c->name ().scope () << "::CCM_" << c->name ().simple () - << "_var" << endl - << "executor_;" << endl << endl; + << t.scoped_name ().scope_name () << "::CCM_" << t.name () + << "_var" << endl + << "executor_;" << endl << endl; - os << c->name ().simple () << "_Context *" << endl - << "context_;" << endl << endl; + os << t.name () << "_Context *" << endl + << "context_;" << endl << endl; os << "::CIAO::Session_Container *" << endl - << "container_;" << endl; + << "container_;" << endl; + + // Generate protected operations for facets and event sinks. + { + Traversal::Defines defines; + PortsEmitterProtected ports_emitter (ctx); + defines.node_traverser (ports_emitter); + + names (t, defines); + } } - + virtual void - traverse (ProvidesDeclPtr const& p) + post (Type& t) { - os << p->type ()->name () << "_var" << endl - << "provide_" << p->name ().simple () << "_;" << endl; - } + // Component servant class closer. + os << "};" << endl; - virtual void - traverse (ConsumesDeclPtr const& c) - { - os << c->type ()->name () << "Consumer_var" << endl - << "consumes_" << c->name ().simple () << "_;" << endl; + // Namespace closer. + os << "}" << endl; } + }; - virtual void - post (ComponentDefPtr const& c) - { - os << "};" << endl; + struct HomeEmitter : Traversal::Home, EmitterBase + { + HomeEmitter (Context& c) + : EmitterBase (c) + {} + + // Nested classes used by this emitter. + private: + struct ManagesEmitter : Traversal::Component, EmitterBase + { + ManagesEmitter (Context& c) + : EmitterBase (c) + {} + + virtual void + traverse (Type& c) + { + os << c.scoped_name (); + } + }; + + struct ManagesSimpleEmitter : Traversal::Component, EmitterBase + { + ManagesSimpleEmitter (Context& c) + : EmitterBase (c) + {} + + virtual void + traverse (Type& c) + { + os << c.name (); + } + }; + + struct ManagesScopeEmitter : Traversal::Component, EmitterBase + { + ManagesScopeEmitter (Context& c) + : EmitterBase (c) + {} + + virtual void + traverse (Type& c) + { + os << c.scoped_name ().scope_name (); + } + }; + + struct HomeOperationEmitter : Traversal::HomeFactory, + Traversal::Home, + OperationEmitter + { + HomeOperationEmitter (Context& c, SemanticGraph::Home& home) + : OperationEmitter (c), + home_ (home) + {} + + virtual void + pre (SemanticGraph::HomeFactory&) + { + os << "virtual "; + } - // Close the CIAO_GLUE namespace, if we opened one. - if (c->scope ()->dynamic_type<IDL2::SyntaxTree::FileScope> () != 0) + virtual void + returns (SemanticGraph::HomeFactory& hf) { - os << "}" << endl; + ReturnTypeNameEmitter manages_emitter (os); + Traversal::Manages manages_; + manages_.node_traverser (manages_emitter); + + manages (home_, manages_); + + os << endl; } - os << endl; - } - }; + virtual void + name (SemanticGraph::HomeFactory& hf) + { + os << hf.name (); + } + virtual void + receives_none (SemanticGraph::HomeFactory&) + { + os << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl; + } - // - // Generates the component home servant interface. - // - class HomeEmitter : public HeaderEmitterBase, - public Traversal::HomeDef, - public Traversal::AttributeDecl //@@ Will disappear - { - private: - string export_macro_; - Declarations const& declarations_; + virtual void + receives_pre (SemanticGraph::HomeFactory&) + { + os << " (" << endl; + } - OperationEmitter& operation_emitter_; + virtual void + receives_post (SemanticGraph::HomeFactory&) + { + os << endl << STRS[ENV_HDR] << ")" << endl; + } - public: - HomeEmitter (ostream& os_, - string export_macro, - Declarations const& declarations, - OperationEmitter& operation_emitter) - : HeaderEmitterBase (os_), - export_macro_ (export_macro), - declarations_ (declarations), - operation_emitter_ (operation_emitter) - { - } + virtual void + raises_none (SemanticGraph::HomeFactory&) + { + os << STRS[EXCP_SNGL]; + } - virtual void - traverse (HomeDefPtr const& h) - { - if (declarations_.find (h)) + virtual void + raises_pre (SemanticGraph::HomeFactory&) { - Traversal::HomeDef::traverse (h); + os << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl; } - } - virtual void - pre (HomeDefPtr const& h) - { - // If we are at file scope, we create a namespace anyway. - if (h->scope ()->dynamic_type<IDL2::SyntaxTree::FileScope> () != 0) + virtual void + raises_post (SemanticGraph::HomeFactory&) + { + os << "))"; + } + + virtual void + post (SemanticGraph::HomeFactory&) { - os << STRS[GLUE_NS] << endl - << "{"; + os << ";" << endl << endl; } - os << "class " << export_macro_ << " " << h->name ().simple () + virtual void + comma (SemanticGraph::HomeFactory&) + { + os << "," << endl; + } + + private: + SemanticGraph::Home& home_; + }; + + public: + virtual void pre (Type& t) + { + os << STRS[GLUE_NS] + << regex::perl_s (t.scoped_name ().scope_name ().str (), "/::/_/") + << "{"; + + ScopedName scoped (t.scoped_name ()); + Name stripped (scoped.begin () + 1, scoped.end ()); + + os << "class " << ctx.export_macro () << " " << t.name () << "_Servant" << endl - << ": public virtual POA_" << h->name ().in_file_scope () - << "," << endl + << ": public virtual POA_" << stripped << "," << endl << STRS[INH_RCSB] << endl << "{" << "public:" << endl; - os << h->name ().simple () << "_Servant (" << endl - << h->name ().scope () << "::CCM_" << h->name ().simple () + os << t.name () << "_Servant (" << endl + << t.scoped_name ().scope_name () << "::CCM_" << t.name () << "_ptr exe," << endl - << "::CIAO::Session_Container *c);" << endl; + << "::CIAO::Session_Container *c);" << endl << endl; - os << "virtual ~" << h->name ().simple () << "_Servant (void);" + os << "virtual ~" << t.name () << "_Servant (void);" << endl << endl; - + + // Generate home factory and other operations. os << "// Home factory and other operations." << endl << endl; - } - - virtual void - traverse (AttributeDeclPtr const& a) - { - // TODO - } + + { + Traversal::Defines defines; + 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); + + ParameterEmitter<Traversal::InParameter> in_param (os); + ParameterEmitter<Traversal::InOutParameter> inout_param (os); + ParameterEmitter<Traversal::OutParameter> out_param (os); + receives.node_traverser (in_param); + receives.node_traverser (inout_param); + receives.node_traverser (out_param); + + ReturnTypeNameEmitter return_type_emitter (os); + TypeNameEmitter type_name_emitter (os); + 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 (os); + INOUTArgTypeNameEmitter inout_arg_emitter (os); + OUTArgTypeNameEmitter out_arg_emitter (os); + in_belongs.node_traverser (in_arg_emitter); + inout_belongs.node_traverser (inout_arg_emitter); + out_belongs.node_traverser (out_arg_emitter); + + names (t, defines); + } + + // Generate operations for component attributes. + os << "// Attribute operations." << endl << endl; + + { + Traversal::Defines defines; + AttributeEmitter attribute_emitter (ctx); + ReadOnlyAttributeEmitter read_only_attribute_emitter (ctx); + defines.node_traverser (attribute_emitter); + defines.node_traverser (read_only_attribute_emitter); + + names (t, defines); + } - virtual void - post (HomeDefPtr const& h) - { // @@@ (JP) Need primary key support. os << "// Operations for keyless home interface." << endl << endl; @@ -1275,28 +1667,38 @@ namespace << STRS[ENV_SNGL_HDR] << ")" << endl << STRS[EXCP_START] << endl << STRS[EXCP_SYS] << "," << endl - << "::Components::CreateFailure));" << endl ; + << "::Components::CreateFailure));" << endl << endl ; os << "// Operations for implicit home interface." << endl << endl; - os << "virtual " << h->manages ()->name () << "_ptr" << endl + os << "virtual "; + + { + Traversal::Manages manages_; + ManagesEmitter manages_emitter (ctx); + manages_.node_traverser (manages_emitter); + + manages (t, manages_); + } + + os << "_ptr" << endl << "create (" << endl << STRS[ENV_SNGL_HDR] << ")" << endl << STRS[EXCP_START] << endl << STRS[EXCP_SYS] << "," << endl - << "::Components::CreateFailure));" << endl; + << "::Components::CreateFailure));" << endl << endl; os << "// Operations for CCMHome interface." << endl << endl; os << "virtual ::CORBA::IRObject_ptr" << endl << "get_component_def (" << endl << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl; + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "virtual ::CORBA::IRObject_ptr" << endl << "get_home_def (" << endl << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl; + << STRS[EXCP_SNGL] << ";" << endl << endl; os << "virtual void" << endl << "remove_component (" << endl @@ -1307,133 +1709,172 @@ namespace << STRS[EXCP_RF] << "));" << endl << endl; os << "// Supported operations." << endl << endl; - - // @@@ (JP) Must include ancestors' supported interfaces as well. - for (SyntaxTree::HomeDef::Iterator i = h->supports_begin (); - i != h->supports_end (); - i++) + + // Generate operations for all supported interfaces. { - operation_emitter_.dispatch (i->resolve ()); + Traversal::Supports supports_; + InterfaceEmitter interface_emitter (ctx); + supports_.node_traverser (interface_emitter); + + Traversal::Defines defines; + Traversal::Inherits inherits; + interface_emitter.edge_traverser (defines); + interface_emitter.edge_traverser (inherits); + + OperationEmitter operation_emitter (ctx); + 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); + + ParameterEmitter<Traversal::InParameter> in_param (os); + ParameterEmitter<Traversal::InOutParameter> inout_param (os); + ParameterEmitter<Traversal::OutParameter> out_param (os); + receives.node_traverser (in_param); + receives.node_traverser (inout_param); + receives.node_traverser (out_param); + + ReturnTypeNameEmitter return_type_emitter (os); + TypeNameEmitter type_name_emitter (os); + 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 (os); + INOUTArgTypeNameEmitter inout_arg_emitter (os); + OUTArgTypeNameEmitter out_arg_emitter (os); + in_belongs.node_traverser (in_arg_emitter); + inout_belongs.node_traverser (inout_arg_emitter); + out_belongs.node_traverser (out_arg_emitter); + + supports (t, supports_); } os << "protected:" << endl << "// CIAO-specific operations." << endl << endl; - os << h->manages ()->name () << "_ptr" << endl - << "_ciao_activate_component (" << endl - << h->manages ()->name ().scope () << "::CCM_" - << h->manages ()->name ().simple () << "_ptr exe" << endl + { + Traversal::Manages manages_; + ManagesEmitter manages_emitter (ctx); + manages_.node_traverser (manages_emitter); + + manages (t, manages_); + } + + os << "_ptr" << endl + << "_ciao_activate_component (" << endl; + + { + Traversal::Manages manages_; + ManagesScopeEmitter manages_emitter (ctx); + manages_.node_traverser (manages_emitter); + + manages (t, manages_); + } + + os << "::CCM_"; + + { + Traversal::Manages manages_; + ManagesSimpleEmitter manages_emitter (ctx); + manages_.node_traverser (manages_emitter); + + manages (t, manages_); + } + + os << "_ptr exe" << endl << STRS[ENV_HDR] << ")" << endl << STRS[EXCP_SNGL] << ";" << endl << endl; os << "void" << endl - << "_ciao_passivate_component (" << endl - << h->manages ()->name () << "_ptr comp" << endl + << "_ciao_passivate_component (" << endl; + + { + Traversal::Manages manages_; + ManagesEmitter manages_emitter (ctx); + manages_.node_traverser (manages_emitter); + + manages (t, manages_); + } + + os << "_ptr comp" << endl << STRS[ENV_SNGL_HDR] << ")" << endl << STRS[EXCP_SNGL] << ";" << endl << endl; os << "protected:" << endl; - os << h->name ().scope () << "::CCM_" - << h->name ().simple () << "_var" << endl + os << t.scoped_name ().scope_name () << "::CCM_" + << t.name () << "_var" << endl << "executor_;" << endl << endl; os << "::CIAO::Session_Container *" << endl << "container_;" << endl << endl; os << "ACE_Hash_Map_Manager_Ex<" << endl - << "PortableServer::ObjectId," << endl - << h->manages ()->name ().simple () << "_Servant *," << endl + << "PortableServer::ObjectId," << endl; + + { + Traversal::Manages manages_; + ManagesSimpleEmitter manages_emitter (ctx); + manages_.node_traverser (manages_emitter); + + manages (t, manages_); + } + + os << "_Servant *," << endl << "TAO_ObjectId_Hash," << endl << "ACE_Equal_To<PortableServer::ObjectId>," << endl << "ACE_SYNCH_MUTEX>" << endl << "component_map_;" << endl; + // Home servant class closer. os << "};" << endl << endl; - os << "extern \"C\" " << export_macro_ << " ::PortableServer::Servant" + os << "extern \"C\" " << ctx.export_macro () << " ::PortableServer::Servant" << endl - << "create" << h->name ().simple () << "_Servant (" << endl + << "create" << t.name () << "_Servant (" << endl << "::Components::HomeExecutorBase_ptr p," << endl << "CIAO::Session_Container *c" << endl << STRS[ENV_HDR] << ");" << endl; - - // Close the CIAO_GLUE namespace, if we opened one. - if (h->scope ()->dynamic_type<IDL2::SyntaxTree::FileScope> () != 0) - { - os << "}" << endl; - } - - os << endl; } - }; - - // - // Generates needed namespaces for modules - // - class NamespaceEmitter : public HeaderEmitterBase, - public Traversal::Module - { - private: - Declarations const& declarations_; - - public: - NamespaceEmitter (ostream& os_, Declarations const& declarations) - : HeaderEmitterBase (os_), - declarations_ (declarations) - { - } - - void - pre (ModulePtr const& m) + + virtual void post (Type& t) { - if (declarations_.contains_suborder (m->order ())) - { - os << STRS[GLUE_NS] << "_" << m->name ().simple () << endl - << "{"; - } + // Namespace closer. + os << "}" << endl; } - - void - post (ModulePtr const& m) - { - if (declarations_.contains_suborder (m->order ())) - { - os << "}" << endl << endl; - } - } - }; -} - -// =========================================================== - -HeaderEmitterBase::HeaderEmitterBase (ostream& os_) - : os (os_) -{ + }; } -ServantHeaderEmitter::ServantHeaderEmitter (ostream& os_, +ServantHeaderEmitter::ServantHeaderEmitter (std::ostream& os_, CommandLine const& cl, string export_macro, - Declarations const& declarations) - : HeaderEmitterBase (os_), + fs::path const& file) + : os (os_), cl_ (cl), export_macro_ (export_macro), - declarations_ (declarations) -{ -} + file_ (file) +{} void -ServantHeaderEmitter::pre (TranslationUnitPtr const& u) +ServantHeaderEmitter::pre (TranslationUnit& u) { os << COPYRIGHT << endl << endl; - fs::path file_path = u->principal_translation_region ()->file_path (); string file_name (""); - if (!file_path.empty ()) + if (!file_.empty ()) { - file_name = file_path.leaf (); + file_name = file_.leaf (); } string uc_file_name = file_name; @@ -1503,109 +1944,83 @@ ServantHeaderEmitter::pre (TranslationUnitPtr const& u) << "#endif /* ACE_LACKS_PRAGMA_ONCE */" << endl << endl; } - void -ServantHeaderEmitter::generate (TranslationUnitPtr const& u) +ServantHeaderEmitter::generate (TranslationUnit& u) { - // This method will use the ServantHeaderEmitter class itself - // as a entry point for the traversal of the tree - - ReturnTypeNameEmitter return_type_name (os); - INArgTypeNameEmitter inarg_type_name (os); - OUTArgTypeNameEmitter outarg_type_name (os); - INOUTArgTypeNameEmitter inoutarg_type_name (os); - - GetAttributeEmitter get_attribute_emitter (os, &return_type_name); - SetAttributeEmitter set_attribute_emitter (os, &inarg_type_name); - - OperationEmitter operation_emitter (os, - &return_type_name, - &inarg_type_name, - &outarg_type_name, - &inoutarg_type_name); - - FactoryEmitter factory_emitter (os, &inarg_type_name); - - FacetEmitter facet_emitter (os, export_macro_); - facet_emitter.add_scope_delegate (&operation_emitter); - - FacetSelector facet_selector (os, declarations_); - facet_selector.add_delegate (&facet_emitter); - - - ContextPublicEmitter context_public_emitter (os, - export_macro_, - declarations_); - - ContextProtectedMethodEmitter - context_protected_method_emitter (os, declarations_); - - ContextProtectedMemberEmitter - context_protected_member_emitter (os, declarations_); - - ServantPublicEmitter servant_public_emitter (os, - export_macro_, - declarations_, - operation_emitter); - - servant_public_emitter.add_scope_delegate (&get_attribute_emitter); - servant_public_emitter.add_scope_delegate (&set_attribute_emitter); - - ServantProtectedEmitter servant_protected_emitter (os, declarations_); - - // Discriminator for operation and factory - // This is needed to select always the most-derived type of traversal - // for any element of the scope of a Home - Traversal::Discriminator d; - d.add (&operation_emitter); - d.add (&factory_emitter); - - HomeEmitter home_emitter (os, - export_macro_, - declarations_, - operation_emitter); - - home_emitter.add_scope_delegate (&d); - home_emitter.add_scope_delegate (&get_attribute_emitter); - home_emitter.add_scope_delegate (&set_attribute_emitter); - - Traversal::FileScope fs; - NamespaceEmitter m (os, declarations_); - fs.add_scope_delegate (&m); - - fs.add_scope_delegate (&context_public_emitter); - m.add_scope_delegate (&context_public_emitter); - fs.add_scope_delegate (&context_protected_method_emitter); - m.add_scope_delegate (&context_protected_method_emitter); - fs.add_scope_delegate (&context_protected_member_emitter); - m.add_scope_delegate (&context_protected_member_emitter); - fs.add_scope_delegate (&servant_public_emitter); - m.add_scope_delegate (&servant_public_emitter); - fs.add_scope_delegate (&servant_protected_emitter); - m.add_scope_delegate (&servant_protected_emitter); - - - fs.add_scope_delegate (&home_emitter); - m.add_scope_delegate (&home_emitter); - fs.add_scope_delegate (&facet_selector); - m.add_scope_delegate (&facet_selector); - - Traversal::TranslationRegion region (&fs); - - add_content_delegate (®ion); - - // Start processing - dispatch (u); + pre (u); + + Traversal::TranslationUnit unit; + + // Layer 1 + // + Traversal::ContainsPrincipal contains_principal; + unit.edge_traverser (contains_principal); + + //-- + Traversal::TranslationRegion region; + contains_principal.node_traverser (region); + + // Layer 2 + // + Traversal::ContainsRoot contains_root; + Traversal::Includes includes; + + region.edge_traverser (includes); + region.edge_traverser (contains_root); + + //-- + Traversal::Root root; + includes.node_traverser (region); + contains_root.node_traverser (root); + + // Layer 3 + // + Traversal::Defines defines; + root.edge_traverser (defines); + + //-- + Traversal::Module module; + Traversal::Composition composition; + defines.node_traverser (module); + defines.node_traverser (composition); + + // Layer 4 + // + Traversal::Defines composition_defines; + composition.edge_traverser (composition_defines); + + //-- + Traversal::ComponentExecutor component_executor; + Traversal::HomeExecutor home_executor; + composition_defines.node_traverser (component_executor); + composition_defines.node_traverser (home_executor); + + // Layer 5 + // + Traversal::Implements implements; + component_executor.edge_traverser (implements); + home_executor.edge_traverser (implements); + + //-- + Context c (os, export_macro_); + ContextEmitter context_emitter (c); + ServantEmitter servant_emitter (c); + HomeEmitter home_emitter (c); + implements.node_traverser (context_emitter); + implements.node_traverser (servant_emitter); + implements.node_traverser (home_emitter); + + unit.traverse (u); + + post (u); } void -ServantHeaderEmitter::post (TranslationUnitPtr const& u) +ServantHeaderEmitter::post (TranslationUnit& u) { - fs::path file_path = u->principal_translation_region ()->file_path (); - - if (file_path.empty ()) return; + if (file_.empty ()) return; - string uc_file_name = file_path.leaf (); + string uc_file_name = file_.leaf (); std::transform (uc_file_name.begin (), uc_file_name.end (), @@ -1620,9 +2035,10 @@ ServantHeaderEmitter::post (TranslationUnitPtr const& u) uc_file_suffix.begin (), upcase); - string guard = "CIAO_GLUE_SESSION_" - + regex::perl_s (uc_file_name, - "/(\\.(IDL|CIDL))?$/" + uc_file_suffix + "/"); + string guard = + "CIAO_GLUE_SESSION_" + + regex::perl_s (uc_file_name, + "/(\\.(IDL|CIDL))?$/" + uc_file_suffix + "/"); guard = regex::perl_s (guard, "/\\./_/"); @@ -1631,10 +2047,3 @@ ServantHeaderEmitter::post (TranslationUnitPtr const& u) << endl << endl; } - -/* - * Local Variables: - * mode: C++ - * c-basic-offset: 2 - * End: - */ |