diff options
author | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2005-04-08 18:38:04 +0000 |
---|---|---|
committer | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2005-04-08 18:38:04 +0000 |
commit | c29e7dc89bccdc884516a3b8164d8980332e4ffc (patch) | |
tree | 3ff22b8640b6b0cc5140f5e2681431facc898549 /TAO/CIAO/CIDLC | |
parent | 92f87ffa62e13094e4be4abd20ca2043971a8fbb (diff) | |
download | ATCD-c29e7dc89bccdc884516a3b8164d8980332e4ffc.tar.gz |
ChangeLogTag: Fri Apr 8 13:33:24 2005 Jeff Parsons <j.parsons@vanderbilt.edu>
Diffstat (limited to 'TAO/CIAO/CIDLC')
-rw-r--r-- | TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp | 233 | ||||
-rw-r--r-- | TAO/CIAO/CIDLC/ServantSourceGenerator.cpp | 370 |
2 files changed, 470 insertions, 133 deletions
diff --git a/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp b/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp index ef34163f4d2..a7ac846a071 100644 --- a/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp +++ b/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp @@ -228,76 +228,216 @@ namespace private: std::ostream& os; }; - - // Generates operations associated with attributes. - // @@@ (JP) Need to support exceptions. - struct AttributeEmitter : Traversal::ReadWriteAttribute, - EmitterBase + + // Generates the set operation of a ReadWriteAttribute. + struct WriteAttributeEmitter : Traversal::ReadWriteAttribute, + EmitterBase { - AttributeEmitter (Context& c) + WriteAttributeEmitter (Context& c) : EmitterBase (c), write_type_name_emitter_ (c.os ()), - read_type_name_emitter_ (c.os ()) + type_name_emitter_ (c.os ()) { write_belongs_.node_traverser (write_type_name_emitter_); - read_belongs_.node_traverser (read_type_name_emitter_); + + edge_traverser (set_raises_); + set_raises_.node_traverser (type_name_emitter_); } - - virtual void traverse (SemanticGraph::ReadWriteAttribute& a) + + virtual void + pre (SemanticGraph::ReadWriteAttribute&) { - os << "virtual "; - - Traversal::ReadWriteAttribute::belongs (a, read_belongs_); - - os << endl - << a.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - - os << "virtual void" << endl - << a.name () << " (" << endl; - + os << "virtual void" << endl; + } + + virtual void + name (SemanticGraph::ReadWriteAttribute& a) + { + os << a.name () << " (" << endl; + Traversal::ReadWriteAttribute::belongs (a, write_belongs_); - - os << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + + os << " " << a.name () << endl + << STRS[ENV_HDR] << ")" << endl; + } + + virtual void + get_raises (SemanticGraph::ReadWriteAttribute&) + { + } + + virtual void + set_raises_none (SemanticGraph::ReadWriteAttribute&) + { + os << STRS[EXCP_SNGL]; + } + + virtual void + set_raises_pre (SemanticGraph::ReadWriteAttribute&) + { + os << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl; + } + + virtual void + set_raises_post (SemanticGraph::ReadWriteAttribute&) + { + os << "))"; + } + + virtual void + post (SemanticGraph::ReadWriteAttribute& a) + { + os << ";" << endl << endl; } + virtual void + comma (SemanticGraph::ReadWriteAttribute&) + { + os << "," << endl; + } + private: INArgTypeNameEmitter write_type_name_emitter_; - ReturnTypeNameEmitter read_type_name_emitter_; + TypeNameEmitter type_name_emitter_; Traversal::Belongs write_belongs_; - Traversal::Belongs read_belongs_; + Traversal::SetRaises set_raises_; }; - // Generates operations associated with readonly attributes. - // @@@ (JP) Need to support exceptions. - struct ReadOnlyAttributeEmitter : Traversal::ReadAttribute, - EmitterBase + // Generates operations associated with attributes. + struct AttributeEmitter : Traversal::ReadAttribute, + Traversal::ReadWriteAttribute, + EmitterBase { - ReadOnlyAttributeEmitter (Context& c) + AttributeEmitter (Context& c) : EmitterBase (c), - read_type_name_emitter_ (c.os ()) + read_type_name_emitter_ (c.os ()), + type_name_emitter_ (c.os ()) { read_belongs_.node_traverser (read_type_name_emitter_); + + edge_traverser (get_raises_); + get_raises_.node_traverser (type_name_emitter_); } + + // ReadWriteAttribute + // + virtual void + pre (SemanticGraph::ReadWriteAttribute& a) + { + os << "virtual "; - virtual void traverse (SemanticGraph::ReadAttribute& a) + Traversal::ReadWriteAttribute::belongs (a, read_belongs_); + + os << endl; + } + + virtual void + name (SemanticGraph::ReadWriteAttribute& a) + { + os << a.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl; + } + + virtual void + get_raises_none (SemanticGraph::ReadWriteAttribute&) + { + os << STRS[EXCP_SNGL]; + } + + virtual void + get_raises_pre (SemanticGraph::ReadWriteAttribute&) + { + os << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl; + } + + virtual void + get_raises_post (SemanticGraph::ReadWriteAttribute&) + { + os << "))"; + } + + virtual void + set_raises (SemanticGraph::ReadWriteAttribute&) + { + } + + virtual void + post (SemanticGraph::ReadWriteAttribute& a) + { + os << ";" << endl << endl; + + WriteAttributeEmitter write_attribute_emitter (ctx); + write_attribute_emitter.traverse (a); + } + + virtual void + comma (SemanticGraph::ReadWriteAttribute&) + { + os << "," << endl; + } + + // ReadAttribute + // + virtual void + pre (SemanticGraph::ReadAttribute& a) { os << "virtual "; Traversal::ReadAttribute::belongs (a, read_belongs_); + + os << endl; + } + + virtual void + name (SemanticGraph::ReadAttribute& a) + { + os << a.name () << " (" << endl + << STRS[ENV_SNGL_HDR] << ")" << endl; + } + + virtual void + get_raises_none (SemanticGraph::ReadAttribute&) + { + os << STRS[EXCP_SNGL]; + } + + virtual void + get_raises_pre (SemanticGraph::ReadAttribute&) + { + os << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl; + } + + virtual void + get_raises_post (SemanticGraph::ReadAttribute&) + { + os << "))"; + } + + virtual void + set_raises (SemanticGraph::ReadAttribute&) + { + } - os << endl - << a.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; + virtual void + post (SemanticGraph::ReadAttribute& a) + { + os << ";" << endl << endl; } + virtual void + comma (SemanticGraph::ReadAttribute&) + { + os << "," << endl; + } + private: ReturnTypeNameEmitter read_type_name_emitter_; + TypeNameEmitter type_name_emitter_; Traversal::Belongs read_belongs_; + Traversal::GetRaises get_raises_; }; struct InterfaceEmitter : Traversal::Interface, @@ -367,10 +507,9 @@ namespace interface_emitter.edge_traverser (defines_); interface_emitter.edge_traverser (inherits_); + // Works for both read/write and readonly attributes. AttributeEmitter attribute_emitter (ctx); - ReadOnlyAttributeEmitter read_only_attribute_emitter (ctx); defines_.node_traverser (attribute_emitter); - defines_.node_traverser (read_only_attribute_emitter); OperationEmitter operation_emitter (ctx); defines_.node_traverser (operation_emitter); @@ -1319,10 +1458,9 @@ namespace interface_emitter.edge_traverser (defines); interface_emitter.edge_traverser (interface_inherits); + // Works for both read/write and readonly attributes. AttributeEmitter attribute_emitter (ctx); - ReadOnlyAttributeEmitter read_only_attribute_emitter (ctx); defines.node_traverser (attribute_emitter); - defines.node_traverser (read_only_attribute_emitter); OperationEmitter operation_emitter (ctx); defines.node_traverser (operation_emitter); @@ -1395,10 +1533,9 @@ namespace component_emitter.edge_traverser (defines); component_emitter.edge_traverser (component_inherits); + // Works for both read/write and readonly attributes. AttributeEmitter attribute_emitter (ctx); - ReadOnlyAttributeEmitter read_only_attribute_emitter (ctx); defines.node_traverser (attribute_emitter); - defines.node_traverser (read_only_attribute_emitter); component_emitter.traverse (t); } @@ -1962,10 +2099,9 @@ namespace home_emitter.edge_traverser (defines); home_emitter.edge_traverser (home_inherits); + // Works for both read/write and readonly attributes. AttributeEmitter attribute_emitter (ctx); - ReadOnlyAttributeEmitter read_only_attribute_emitter (ctx); defines.node_traverser (attribute_emitter); - defines.node_traverser (read_only_attribute_emitter); home_emitter.traverse (t); } @@ -1989,10 +2125,9 @@ namespace interface_emitter.edge_traverser (defines); interface_emitter.edge_traverser (inherits); + // Works for both read/write and readonly attributes. AttributeEmitter attribute_emitter (ctx); - ReadOnlyAttributeEmitter read_only_attribute_emitter (ctx); defines.node_traverser (attribute_emitter); - defines.node_traverser (read_only_attribute_emitter); OperationEmitter operation_emitter (ctx); defines.node_traverser (operation_emitter); diff --git a/TAO/CIAO/CIDLC/ServantSourceGenerator.cpp b/TAO/CIAO/CIDLC/ServantSourceGenerator.cpp index 09fee310444..be9506a5840 100644 --- a/TAO/CIAO/CIDLC/ServantSourceGenerator.cpp +++ b/TAO/CIAO/CIDLC/ServantSourceGenerator.cpp @@ -428,26 +428,129 @@ namespace std::set<Interface*> interfaces_; }; + // Generates the set operation of a ReadWriteAttribute. + template <typename T> + struct WriteAttributeEmitter : Traversal::ReadWriteAttribute, + EmitterBase + { + WriteAttributeEmitter (Context& c, T& scope, bool swapping) + : EmitterBase (c), + scope_ (scope), + write_type_name_emitter_ (c.os ()), + type_name_emitter_ (c.os ()), + swapping_ (swapping) + { + write_belongs_.node_traverser (write_type_name_emitter_); + + edge_traverser (set_raises_); + set_raises_.node_traverser (type_name_emitter_); + } + + virtual void + gen_swapping_set () + { + os << "this->activate_component (" << STRS[ENV_SNGL_ARG] << ");" + << "ACE_CHECK;" << endl; + } + + virtual void + pre (SemanticGraph::ReadWriteAttribute&) + { + os << "void" << endl; + } + + virtual void + name (SemanticGraph::ReadWriteAttribute& a) + { + os << scope_.name () << "_Servant::" << a.name () << " (" << endl; + + Traversal::ReadWriteAttribute::belongs (a, write_belongs_); + + os << " " << a.name () << endl + << STRS[ENV_SRC] << ")" << endl; + } + + virtual void + get_raises (SemanticGraph::ReadWriteAttribute&) + { + } + + virtual void + set_raises_none (SemanticGraph::ReadWriteAttribute&) + { + os << STRS[EXCP_SNGL]; + } + + virtual void + set_raises_pre (SemanticGraph::ReadWriteAttribute&) + { + os << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl; + } + + virtual void + set_raises_post (SemanticGraph::ReadWriteAttribute&) + { + os << "))" << endl; + } + + virtual void + post (SemanticGraph::ReadWriteAttribute& a) + { + os << "{"; + + if (swapping_) + { + this->gen_swapping_set (); + } + + os << "this->executor_->" << a.name () << " (" << endl + << a.name () << endl + << STRS[ENV_ARG] << ");" << endl + << "}"; + } + + virtual void + comma (SemanticGraph::ReadWriteAttribute&) + { + os << "," << endl; + } + + protected: + T& scope_; + Traversal::Belongs write_belongs_; + + private: + INArgTypeNameEmitter write_type_name_emitter_; + TypeNameEmitter type_name_emitter_; + Traversal::SetRaises set_raises_; + bool swapping_; + }; + // Generates operations associated with attributes. - // @@@ (JP) Need to support exceptions. template <typename T> - struct AttributeEmitter : Traversal::ReadWriteAttribute, + struct AttributeEmitter : Traversal::ReadAttribute, + Traversal::ReadWriteAttribute, EmitterBase { AttributeEmitter (Context& c, T& scope) : EmitterBase (c), scope_ (scope), - write_type_name_emitter_ (c.os ()), read_type_name_emitter_ (c.os ()), + type_name_emitter_ (c.os ()), ace_check_return_emitter_ (c.os ()) { - write_belongs_.node_traverser (write_type_name_emitter_); read_belongs_.node_traverser (read_type_name_emitter_); ace_check_return_belongs_.node_traverser (ace_check_return_emitter_); + + edge_traverser (get_raises_); + get_raises_.node_traverser (type_name_emitter_); } - // Overridden by facet attribute emitter to do nothing. - + // ReadWriteAttribute + // + + // Overridden by facet attribute emitter. virtual void gen_swapping_get (SemanticGraph::ReadWriteAttribute& a) { @@ -458,36 +561,60 @@ namespace os << endl; } + // Overridden by facet attribute emitter. virtual void - gen_swapping_set () + gen_write_operation (SemanticGraph::ReadWriteAttribute& a, + bool swapping) { - os << "this->activate_component (" << STRS[ENV_SNGL_ARG] << ");" - << "ACE_CHECK;" << endl; + WriteAttributeEmitter<T> write_attribute_emitter (ctx, + scope_, + swapping); + write_attribute_emitter.traverse (a); + } + + virtual void + pre (SemanticGraph::ReadWriteAttribute& a) + { + Traversal::ReadWriteAttribute::belongs (a, read_belongs_); + + os << endl; } virtual void name (SemanticGraph::ReadWriteAttribute& a) { - os << scope_.name () << "_Servant::" << a.name (); + os << scope_.name () << "_Servant::" << a.name () << " (" << endl + << STRS[ENV_SNGL_SRC] << ")" << endl; } - + virtual void - traverse (SemanticGraph::ReadWriteAttribute& a) + get_raises_none (SemanticGraph::ReadWriteAttribute&) { - // Does nothing here, overridden for facet attributes. - this->pre (a); - - Traversal::ReadWriteAttribute::belongs (a, read_belongs_); - - os << endl; - - // Overridden for facet attributes. - this->name (a); + os << STRS[EXCP_SNGL] << endl; + } + + virtual void + get_raises_pre (SemanticGraph::ReadWriteAttribute&) + { + os << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl; + } + + virtual void + get_raises_post (SemanticGraph::ReadWriteAttribute&) + { + os << "))" << endl; + } + + virtual void + set_raises (SemanticGraph::ReadWriteAttribute&) + { + } - os << " (" << endl - << STRS[ENV_SNGL_SRC] << ")" << endl - << STRS[EXCP_SNGL] << endl - << "{"; + virtual void + post (SemanticGraph::ReadWriteAttribute& a) + { + os << "{"; string swap_option = ctx.cl ().get_value ("custom-container", ""); bool swapping = (swap_option == "upgradeable"); @@ -501,44 +628,102 @@ namespace << STRS[ENV_SNGL_ARG] << ");" << endl << "}"; - // Does nothing here, overridden for facet attributes. - this->pre (a); + this->gen_write_operation (a, swapping); + } - os << "void" << endl; + virtual void + comma (SemanticGraph::ReadWriteAttribute&) + { + os << "," << endl; + } + + // ReadAttribute + // - // Overridden for facet attributes. - this->name (a); + // Overridden by facet attribute emitter to do nothing. + virtual void + gen_swapping_get (SemanticGraph::ReadAttribute& a) + { + os << "this->activate_component (" << STRS[ENV_SNGL_ARG] << ");"; - os << " (" << endl; + Traversal::ReadAttribute::belongs (a, ace_check_return_belongs_); + + os << endl; + } - Traversal::ReadWriteAttribute::belongs (a, write_belongs_); + virtual void + pre (SemanticGraph::ReadAttribute& a) + { + Traversal::ReadAttribute::belongs (a, read_belongs_); - os << " " << a.name () << endl - << STRS[ENV_SRC] << ")" << endl - << STRS[EXCP_SNGL] << endl - << "{"; + os << endl; + } + + virtual void + name (SemanticGraph::ReadAttribute& a) + { + os << scope_.name () << "_Servant::" << a.name () << " (" << endl + << STRS[ENV_SNGL_SRC] << ")" << endl; + } + + virtual void + get_raises_none (SemanticGraph::ReadAttribute&) + { + os << STRS[EXCP_SNGL] << endl; + } + + virtual void + get_raises_pre (SemanticGraph::ReadAttribute&) + { + os << STRS[EXCP_START] << endl + << STRS[EXCP_SYS] << "," << endl; + } + + virtual void + get_raises_post (SemanticGraph::ReadAttribute&) + { + os << "))" << endl; + } + + virtual void + set_raises (SemanticGraph::ReadAttribute&) + { + } + + virtual void + post (SemanticGraph::ReadAttribute& a) + { + os << "{"; + string swap_option = ctx.cl ().get_value ("custom-container", ""); + bool swapping = (swap_option == "upgradeable"); + if (swapping) { - this->gen_swapping_set (); + this->gen_swapping_get (a); } - os << "this->executor_->" << a.name () << " (" << endl - << a.name () << endl - << STRS[ENV_ARG] << ");" << endl + os << "return this->executor_->" << a.name () << " (" << endl + << STRS[ENV_SNGL_ARG] << ");" << endl << "}"; } + virtual void + comma (SemanticGraph::ReadAttribute&) + { + os << "," << endl; + } + protected: T& scope_; private: - INArgTypeNameEmitter write_type_name_emitter_; ReturnTypeNameEmitter read_type_name_emitter_; + TypeNameEmitter type_name_emitter_; AceCheckReturnEmitter ace_check_return_emitter_; - Traversal::Belongs write_belongs_; Traversal::Belongs read_belongs_; Traversal::Belongs ace_check_return_belongs_; + Traversal::GetRaises get_raises_; }; // Generates operations associated with readonly attributes. @@ -653,6 +838,36 @@ namespace << scope_.name () << "_Servant_T<T>::" << o.name (); } }; + + struct FacetWriteAttributeEmitter + : WriteAttributeEmitter<SemanticGraph::Interface> + { + // Since swapping does not affect facets, we can just pass 'false' + // to the base class constructor, and not override gen_swapping_set(). + FacetWriteAttributeEmitter (Context& c, SemanticGraph::Interface& i) + : WriteAttributeEmitter<SemanticGraph::Interface> (c, i, false) + {} + + virtual void + pre (SemanticGraph::ReadWriteAttribute& a) + { + os << "template <typename T>" << endl; + + WriteAttributeEmitter<SemanticGraph::Interface>::pre (a); + } + + virtual void + name (SemanticGraph::ReadWriteAttribute& a) + { + os << scope_.name () << "_Servant_T<T>::" + << a.name () << " (" << endl; + + Traversal::ReadWriteAttribute::belongs (a, write_belongs_); + + os << " " << a.name () << endl + << STRS[ENV_SRC] << ")" << endl; + } + }; struct FacetAttributeEmitter : AttributeEmitter<SemanticGraph::Interface> @@ -662,57 +877,62 @@ namespace : AttributeEmitter<SemanticGraph::Interface> (c, i) {} - // No-op overrides because we don't want to generate any swapping - // code for facets. + // ReadWriteAttribute + // + // No-op override because we don't want to generate any swapping + // code for facets. virtual void gen_swapping_get (SemanticGraph::ReadWriteAttribute&) { } - - virtual void gen_swapping_set () + + virtual void + gen_write_operation (SemanticGraph::ReadWriteAttribute& a, + bool /* swapping */) { + FacetWriteAttributeEmitter write_attribute_emitter (ctx, scope_); + write_attribute_emitter.traverse (a); } - + virtual void - pre (SemanticGraph::ReadWriteAttribute&) + pre (SemanticGraph::ReadWriteAttribute& a) { os << "template <typename T>" << endl; + + AttributeEmitter<SemanticGraph::Interface>::pre (a); } virtual void name (SemanticGraph::ReadWriteAttribute& a) { - os << scope_.name () << "_Servant_T<T>::" << a.name (); + os << scope_.name () << "_Servant_T<T>::" + << a.name () << " (" << endl + << STRS[ENV_SNGL_SRC] << ")" << endl; } - }; - struct FacetReadOnlyAttributeEmitter - : ReadOnlyAttributeEmitter<SemanticGraph::Interface> - { - FacetReadOnlyAttributeEmitter (Context& c, - SemanticGraph::Interface& i) - : ReadOnlyAttributeEmitter<SemanticGraph::Interface> (c, i) - {} - - // Overridden from ReadOnlyAttributeEmitter to do nothing, - // since we don't want to generate swapping-related code - // facet attributes. + // ReadAttribute + // - virtual void - gen_swapping_get (SemanticGraph::ReadAttribute&) + // No-op override because we don't want to generate any swapping + // code for facets. + virtual void gen_swapping_get (SemanticGraph::ReadAttribute&) { } - + virtual void - pre (SemanticGraph::ReadAttribute&) + pre (SemanticGraph::ReadAttribute& a) { os << "template <typename T>" << endl; + + AttributeEmitter<SemanticGraph::Interface>::pre (a); } virtual void name (SemanticGraph::ReadAttribute& a) { - os << scope_.name () << "_Servant_T<T>::" << a.name (); + os << scope_.name () << "_Servant_T<T>::" + << a.name () << " (" << endl + << STRS[ENV_SNGL_SRC] << ")" << endl; } }; @@ -754,9 +974,7 @@ namespace interface_emitter.edge_traverser (inherits_); FacetAttributeEmitter attribute_emitter (ctx, i); - FacetReadOnlyAttributeEmitter read_only_attribute_emitter (ctx, i); defines_.node_traverser (attribute_emitter); - defines_.node_traverser (read_only_attribute_emitter); FacetOperationEmitter operation_emitter (ctx, i); defines_.node_traverser (operation_emitter); @@ -3324,11 +3542,7 @@ namespace interface_emitter.edge_traverser (interface_inherits); AttributeEmitter<SemanticGraph::Component> attribute_emitter (ctx, t); - ReadOnlyAttributeEmitter< - SemanticGraph::Component - > read_only_attribute_emitter (ctx, t); defines.node_traverser (attribute_emitter); - defines.node_traverser (read_only_attribute_emitter); OperationEmitter<SemanticGraph::Component> operation_emitter (ctx, t); defines.node_traverser (operation_emitter); @@ -3382,11 +3596,7 @@ namespace component_emitter.edge_traverser (defines); AttributeEmitter<SemanticGraph::Component> attribute_emitter (ctx, t); - ReadOnlyAttributeEmitter< - SemanticGraph::Component - > read_only_attribute_emitter (ctx, t); defines.node_traverser (attribute_emitter); - defines.node_traverser (read_only_attribute_emitter); component_emitter.traverse (t); } @@ -3854,11 +4064,7 @@ namespace interface_emitter.edge_traverser (interface_inherits); AttributeEmitter<SemanticGraph::Home> attribute_emitter (ctx, t); - ReadOnlyAttributeEmitter< - SemanticGraph::Home - > read_only_attribute_emitter (ctx, t); defines.node_traverser (attribute_emitter); - defines.node_traverser (read_only_attribute_emitter); OperationEmitter<SemanticGraph::Home> operation_emitter (ctx, t); defines.node_traverser (operation_emitter); @@ -3966,11 +4172,7 @@ namespace home_emitter.edge_traverser (defines); AttributeEmitter<SemanticGraph::Home> attribute_emitter (ctx, t); - ReadOnlyAttributeEmitter< - SemanticGraph::Home - > read_only_attribute_emitter (ctx, t); defines.node_traverser (attribute_emitter); - defines.node_traverser (read_only_attribute_emitter); home_emitter.traverse (t); } |