// // $Id$ // // ============================================================================ // // = LIBRARY // TAO IDL // // = FILENAME // discriminant_cs.cpp // // = DESCRIPTION // Visitor generating code for discriminant of the union // // = AUTHOR // Aniruddha Gokhale // // ============================================================================ #include "idl.h" #include "idl_extern.h" #include "be.h" #include "be_visitor_union.h" ACE_RCSID(be_visitor_union, discriminant_cs, "$Id$") // ************************************************************************* // be_visitor_discriminant_cs - visitor for discriminant in client stubs // ************************************************************************* be_visitor_union_discriminant_cs::be_visitor_union_discriminant_cs (be_visitor_context *ctx) : be_visitor_decl (ctx) { } be_visitor_union_discriminant_cs::~be_visitor_union_discriminant_cs (void) { } int be_visitor_union_discriminant_cs::visit_enum (be_enum *node) { be_union *bu = this->ctx_->be_node_as_union (); // get the enclosing union backend be_type *bt; // check if we are visiting this node via a visit to a typedef node if (this->ctx_->alias ()) bt = this->ctx_->alias (); else bt = node; if (bt->node_type () != AST_Decl::NT_typedef // not a typedef && bt->is_child (bu)) // bt is defined inside the union { // instantiate a visitor context with a copy of our context. This info // will be modified based on what type of node we are visiting be_visitor_context ctx (*this->ctx_); ctx.node (node); // set the node to be the node being visited. The scope // is still the same // generate the typecode for the enum ctx.state (TAO_CodeGen::TAO_ENUM_CS); be_visitor *visitor = tao_cg->make_visitor (&ctx); if (!visitor) { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_visitor_union_discriminant_cs::" "visit_enum - " "Bad visitor\n" ), -1); } if (node->accept (visitor) == -1) { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_visitor_union_discriminant_cs::" "visit_enum - " "codegen failed\n" ), -1); } delete visitor; } return 0; }