summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_root/root_sth.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_root/root_sth.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_root/root_sth.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_root/root_sth.cpp b/TAO/TAO_IDL/be/be_visitor_root/root_sth.cpp
new file mode 100644
index 00000000000..6d5b615bf3f
--- /dev/null
+++ b/TAO/TAO_IDL/be/be_visitor_root/root_sth.cpp
@@ -0,0 +1,203 @@
+//
+// $Id$
+//
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO IDL
+//
+// = FILENAME
+// root_sth.cpp
+//
+// = DESCRIPTION
+// Visitor generating code for Root in the server template header
+//
+// = AUTHOR
+// Jeff Parsons
+//
+// ============================================================================
+
+#include "idl.h"
+#include "idl_extern.h"
+#include "be.h"
+
+#include "be_visitor_root.h"
+#include "be_visitor_interface.h"
+
+ACE_RCSID(be_visitor_root, root_sth, "$Id$")
+
+
+// ****************************************
+// Root visitor for server template header
+// ****************************************
+
+be_visitor_root_sth::be_visitor_root_sth (be_visitor_context *ctx)
+ : be_visitor_root (ctx)
+{
+}
+
+be_visitor_root_sth::~be_visitor_root_sth (void)
+{
+}
+
+int
+be_visitor_root_sth::init (void)
+{
+ // Open the file.
+ if (tao_cg->start_server_template_header (
+ be_global->be_get_server_template_hdr_fname ()
+ )
+ == -1)
+ {
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ "(%N:%l) be_visitor_root_sth::init - "
+ "Error:Unable to open server template header file : %s\n",
+ be_global->be_get_server_template_hdr_fname ()
+ ),
+ -1
+ );
+ }
+
+ // Set the stream and the next state.
+ this->ctx_->stream (tao_cg->server_template_header ());
+ return 0;
+}
+
+int
+be_visitor_root_sth::visit_scope (be_scope *node)
+{
+ // Proceed if the number of members in our scope is greater than 0.
+ if (node->nmembers () > 0)
+ {
+ // Initialize an iterator to iterate over our scope.
+ UTL_ScopeActiveIterator si (node,
+ UTL_Scope::IK_decls);
+ // Continue until each element is visited.
+ while (!si.is_done ())
+ {
+ AST_Decl *d = si.item ();
+
+ if (d == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_root_sth::visit_scope - "
+ "bad node in this scope\n"),
+ -1);
+
+ }
+
+ AST_Decl::NodeType nt = d->node_type ();
+
+ // These are the onlh types we're interested in.
+ if (nt != AST_Decl::NT_module
+ && nt != AST_Decl::NT_interface)
+ {
+ si.next ();
+ continue;
+ }
+
+ be_decl *bd = be_decl::narrow_from_decl (d);
+
+ // Set the scope node as "node" in which the code is being
+ // generated so that elements in the node's scope can use it
+ // for code generation.
+ this->ctx_->scope (node->decl ());
+
+ // Set the node to be visited.
+ this->ctx_->node (bd);
+
+ // Send the visitor.
+ if (bd == 0 || bd->accept (this) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_root_sth::visit_scope - "
+ "codegen for scope failed\n"),
+ -1);
+
+ }
+
+ si.next ();
+ } // End of while loop.
+ } // End of if.
+
+ return 0;
+}
+
+int
+be_visitor_root_sth::visit_module (be_module *node)
+{
+ if (node->imported ())
+ {
+ return 0;
+ }
+
+ TAO_OutStream *os = tao_cg->server_template_header ();
+
+ // Generate the skeleton class name.
+
+ os->indent ();
+
+ // Now generate the class definition. The prefix POA_ is prepended to our
+ // name only if we are the outermost module.
+ *os << "TAO_NAMESPACE ";
+
+ if (node->is_nested ())
+ {
+ // We are inside another module.
+ *os << " " << node->local_name () << be_nl;
+ }
+ else
+ {
+ // We are outermost module.
+ *os << " POA_" << node->local_name () << be_nl;
+ }
+
+ *os << "{\n" << be_idt;
+
+ if (this->visit_scope (node) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_root_sth::"
+ "visit_module - "
+ "codegen for scope failed\n"),
+ -1);
+ }
+
+ os->decr_indent ();
+ *os << "}" << be_nl << "TAO_NAMESPACE_CLOSE // module "
+ << node->name () << "\n\n";
+
+ return 0;
+}
+
+int
+be_visitor_root_sth::visit_interface (be_interface *node)
+{
+ if (node->imported () || node->is_local ())
+ {
+ return 0;
+ }
+
+ // Generate the TIE class.
+
+ this->ctx_->state (TAO_CodeGen::TAO_INTERFACE_TIE_SH);
+ this->ctx_->node (node);
+
+ be_visitor_interface_tie_sh visitor (this->ctx_);
+
+ if (node->accept (&visitor) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_visitor_root_sth::"
+ "visit_interface - "
+ "codegen for TIE class failed\n"),
+ -1);
+ }
+
+ this->ctx_->state (TAO_CodeGen::TAO_ROOT_TIE_SH);
+
+ return 0;
+}
+