summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be_include/be_visitor_context.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be_include/be_visitor_context.h')
-rw-r--r--TAO/TAO_IDL/be_include/be_visitor_context.h292
1 files changed, 292 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be_include/be_visitor_context.h b/TAO/TAO_IDL/be_include/be_visitor_context.h
new file mode 100644
index 00000000000..c2837eaec91
--- /dev/null
+++ b/TAO/TAO_IDL/be_include/be_visitor_context.h
@@ -0,0 +1,292 @@
+//
+// $Id$
+//
+
+/* -*- C++ -*- */
+// ============================================================================
+//
+// = LIBRARY
+// TAO IDL
+//
+// = FILENAME
+// be_visitor_context.h
+//
+// = DESCRIPTION
+// This class serves to provide all the necessary context information to the
+// visitor as it generates code. This may include the scope inside which the
+// code is generated, the output file that is being used, and others. This
+// context information will be passed to the abstract/concrete visitor
+// factory which in turn will use it to construct the right visitor.
+//
+// = AUTHOR
+// Aniruddha Gokhale
+//
+// ============================================================================
+
+#ifndef TAO_BE_VISITOR_CONTEXT_H
+#define TAO_BE_VISITOR_CONTEXT_H
+
+#include "be_codegen.h"
+
+
+class TAO_OutStream;
+class be_decl;
+class be_typedef;
+class be_attribute;
+class be_interface;
+class be_interface_fwd;
+class be_argument;
+class be_array;
+class be_constant;
+class be_enum;
+class be_enum_val;
+class be_exceptionl;
+class be_field;
+class be_module;
+class be_operation;
+class be_exception;
+class be_predefined_type;
+class be_root;
+class be_sequence;
+class be_string;
+class be_structure;
+class be_typedef;
+class be_union;
+class be_union_branch;
+
+// When interface is defined as macro redefine it as aceinterface
+#if defined (interface)
+# define aceinterface interface
+# undef interface
+#endif /* interface */
+
+class be_visitor_context
+{
+public:
+ be_visitor_context (void);
+ // default constructor
+
+ be_visitor_context (const be_visitor_context &ctx);
+ // default constructor
+
+ ~be_visitor_context (void);
+ // destructor
+
+ be_visitor_context &operator= (const be_visitor_context &ctx);
+ // assignment operator
+
+ // =helpers
+
+ void reset (void);
+ // reset the context
+
+ void stream (TAO_OutStream *os);
+ // set the output stream
+
+ TAO_OutStream *stream (void);
+ // get the stream
+
+ void scope (be_decl *scope);
+ // set the scope
+
+ be_decl *scope (void);
+ // get the scope in which code will be generated
+
+ void node (be_decl *node);
+ // current node being visited
+
+ be_decl *node (void);
+ // node being visited
+
+ void state (TAO_CodeGen::CG_STATE);
+ // code generation state
+
+ TAO_CodeGen::CG_STATE state (void);
+ // return the code generation state
+
+ void sub_state (TAO_CodeGen::CG_SUB_STATE);
+ // code generation state
+
+ TAO_CodeGen::CG_SUB_STATE sub_state (void);
+ // return the code generation state
+
+ void alias (be_typedef *node);
+ // set the alias node (if any)
+
+ be_typedef *alias (void);
+ // return the aliased node (if any)
+
+ void tdef (be_typedef *node);
+ // set the typedef node (if any)
+
+ be_typedef *tdef (void);
+ // return the typedef node (if any)
+
+ void attribute (be_attribute *attr);
+ // set the attribute node if any
+
+ be_attribute *attribute (void);
+ // get the attribute node
+
+ void exception (bool);
+ // is it the special ctor for exceptions?
+
+ bool exception (void);
+ // is it the special ctor for exceptions?
+
+ void comma (bool);
+ // scope supoorts generation of comma after each element
+
+ bool comma (void);
+ // are we supposed to generate a comma?
+
+ be_interface *interface (void) const;
+ void interface (be_interface*);
+ // In some cases we need to generate the objects of one interface as
+ // members of a derived visitor (the TIE classes are a good
+ // example). This field is use to hold the interface where we are
+ // *generating* code, as opposed to the interfaces where the methods
+ // or structures are defined.
+
+ // = helpers
+
+ // visitors may need the actual type of the node stored in this context. We
+ // could have kept separate nodes but that would have increased the size of
+ // the context class by a large extent. So we will rely on the
+ // "narrow_from_decl" approach
+
+ // two types of helpers are provided here. One of them returns the node as
+ // the desired actual type. The other returns the scope as the desired type.
+
+ be_argument *be_node_as_argument (void);
+ // return the node as argument if possible
+
+ be_array *be_node_as_array (void);
+ // return the node as array if possible
+
+ be_attribute *be_node_as_attribute (void);
+ // return the node as attribute if possible
+
+ be_constant *be_node_as_constant (void);
+ // return the node as constant if possible
+
+ be_enum *be_node_as_enum (void);
+ // return the node as enum if possible
+
+ be_enum_val *be_node_as_enum_val (void);
+ // return the node as enum_val if possible
+
+ be_exception *be_node_as_exception (void);
+ // return the node as exception if possible
+
+ be_field *be_node_as_field (void);
+ // return the node as field if possible
+
+ be_interface *be_node_as_interface (void);
+ // return the node as interface if possible
+
+ be_interface_fwd *be_node_as_interface_fwd (void);
+ // return the node as interface_fwd if possible
+
+ be_module *be_node_as_module (void);
+ // return the node as module if possible
+
+ be_operation *be_node_as_operation (void);
+ // return the node as operation if possible
+
+ be_predefined_type *be_node_as_predefined_type (void);
+ // return the node as predefined_type if possible
+
+ be_root *be_node_as_root (void);
+ // return the node as root if possible
+
+ be_sequence *be_node_as_sequence (void);
+ // return the node as sequence if possible
+
+ be_string *be_node_as_string (void);
+ // return the node as string if possible
+
+ be_structure *be_node_as_structure (void);
+ // return the node as structure if possible
+
+ be_typedef *be_node_as_typedef (void);
+ // return the node as typedef if possible
+
+ be_union *be_node_as_union (void);
+ // return the node as union if possible
+
+ be_union_branch *be_node_as_union_branch (void);
+ // return the node as union_branch if possible
+
+ // for scope
+
+ be_enum *be_scope_as_enum (void);
+ // return the scope as enum if possible
+
+ be_exception *be_scope_as_exception (void);
+ // return the scope as exception if possible
+
+ be_interface *be_scope_as_interface (void);
+ // return the scope as interface if possible
+
+ be_module *be_scope_as_module (void);
+ // return the scope as module if possible
+
+ be_operation *be_scope_as_operation (void);
+ // return the scope as operation if possible
+
+ be_root *be_scope_as_root (void);
+ // return the scope as root if possible
+
+ be_structure *be_scope_as_structure (void);
+ // return the scope as structure if possible
+
+ be_union *be_scope_as_union (void);
+ // return the scope as union if possible
+
+ const char *export_macro (void) const;
+ // return the export macro currently in force
+
+ const char *non_null_export_macro (void) const;
+ // if anyop export macro is empty, check stub.
+
+private:
+ TAO_CodeGen::CG_STATE state_;
+ // code generation state
+
+ TAO_CodeGen::CG_SUB_STATE sub_state_;
+ // code generation state
+
+ TAO_OutStream *os_;
+ // current output stream
+
+ be_decl *scope_;
+ // current scope in which code is generated
+
+ be_decl *node_;
+ // current node
+
+ be_typedef *alias_;
+ // aliased node used as a scoped name to define IDL types.
+
+ be_typedef *tdef_;
+ // typedef node
+
+ be_attribute *attr_;
+ // attribute node stored here while generating its code
+
+ bool exception_;
+ // is it the special ctor for exceptions?
+
+ bool comma_;
+ // whether scope should generate a comma after every element
+
+ be_interface* interface_;
+ // See the method declaration above.
+};
+
+#if defined (interface)
+# define interface aceinterface
+#endif /* interface */
+
+#endif /* BE_VISITOR_CONTEXT_H */