summaryrefslogtreecommitdiff
path: root/modules/TAO/TAO_IDL/include/ast_visitor_tmpl_module_inst.h
blob: 05622a00e85a33c4527904361384e3c0ef0f70e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//
// $Id$
//

/* -*- c++ -*- */
// ============================================================================
//
// = LIBRARY
//    TAO IDL
//
// = FILENAME
//    ast_visitor_tmpl_module_inst.h
//
// = DESCRIPTION
//    This visitor creates nodes resulting from the
//    instantiation of a template module, and adds these nodes
//    to the AST.
//
// = AUTHOR
//    Jeff Parsons
//
// ============================================================================

#ifndef TAO_AST_VISITOR_TMPL_MODULE_INST_H
#define TAO_AST_VISITOR_TMPL_MODULE_INST_H

#include "ast_visitor.h"
#include "fe_utils.h"

class UTL_ExceptList;
class UTL_NameList;
class ast_visitor_context;

class ast_visitor_tmpl_module_inst : public ast_visitor
{
  //
  // = TITLE
  //   ast_visitor_tmpl_module_inst
  //
  // = DESCRIPTION
  //   Adds implied IDL code to the AST related to the
  //   instantiation or alias of a template module.
  //
public:
  ast_visitor_tmpl_module_inst (ast_visitor_context *ctx,
                                bool ref_only = false);

  virtual ~ast_visitor_tmpl_module_inst (void);

  virtual int visit_decl (AST_Decl *d);
  virtual int visit_scope (UTL_Scope *node);
  virtual int visit_type (AST_Type *node);
  virtual int visit_predefined_type (AST_PredefinedType *node);
  virtual int visit_interface_fwd (AST_InterfaceFwd *node);
  virtual int visit_valuetype_fwd (AST_ValueTypeFwd *node);
  virtual int visit_component (AST_Component *node);
  virtual int visit_home (AST_Home *node);
  virtual int visit_component_fwd (AST_ComponentFwd *node);
  virtual int visit_template_module_ref (AST_Template_Module_Ref *node);
  virtual int visit_porttype (AST_PortType *node);
  virtual int visit_provides (AST_Provides *node);
  virtual int visit_uses (AST_Uses *node);
  virtual int visit_publishes (AST_Publishes *node);
  virtual int visit_emits (AST_Emits *node);
  virtual int visit_consumes (AST_Consumes *node);
  virtual int visit_extended_port (AST_Extended_Port *node);
  virtual int visit_mirror_port (AST_Mirror_Port *node);
  virtual int visit_connector (AST_Connector *node);
  virtual int visit_eventtype_fwd (AST_EventTypeFwd *node);
  virtual int visit_structure_fwd (AST_StructureFwd *node);
  virtual int visit_exception (AST_Exception *node);
  virtual int visit_expression (AST_Expression *node);
  virtual int visit_enum (AST_Enum *node);
  virtual int visit_union (AST_Union *node);
  virtual int visit_union_fwd (AST_UnionFwd *node);
  virtual int visit_union_branch (AST_UnionBranch *node);
  virtual int visit_union_label (AST_UnionLabel *node);
  virtual int visit_enum_val (AST_EnumVal *node);
  virtual int visit_array (AST_Array *node);
  virtual int visit_sequence (AST_Sequence *node);
  virtual int visit_string (AST_String *node);
  virtual int visit_native (AST_Native *node);
  virtual int visit_valuebox (AST_ValueBox *node);
  virtual int visit_param_holder (AST_Param_Holder *node);
  virtual int visit_root (AST_Root *node);
  virtual int visit_module (AST_Module *node);
  virtual int visit_template_module (AST_Template_Module *node);
  virtual int visit_template_module_inst (AST_Template_Module_Inst *node);
  virtual int visit_eventtype (AST_EventType *node);
  virtual int visit_valuetype (AST_ValueType  *node);
  virtual int visit_interface (AST_Interface *node);
  virtual int visit_attribute (AST_Attribute *node);
  virtual int visit_operation (AST_Operation *node);
  virtual int visit_argument (AST_Argument *node);
  virtual int visit_typedef (AST_Typedef *node);
  virtual int visit_constant (AST_Constant *node);
  virtual int visit_structure (AST_Structure *node);
  virtual int visit_field (AST_Field *node);
  virtual int visit_factory (AST_Factory *node);
  virtual int visit_finder (AST_Finder *node);
  
private:
  // If arg is a param holder, return the matching template arg,
  // otherwise return arg unchanged. If the arg is declared in
  // the scope of a template module, the returned node will be a
  // copy created in the scope of the template module instantiation.
  AST_Decl *reify_type (AST_Decl *d);
  
  // Utility method used for attributes and operations.
  UTL_ExceptList *reify_exception_list (UTL_ExceptList *orig);
  
  // Utility method to create a NameList from a list of inherited
  // or supported types that may contain a template param ref.
  UTL_NameList *create_name_list (AST_Type **list, long length);
  
private:
  ast_visitor_context *ctx_;

  // Flag to branch in visit_valuetype() where we create an
  // eventtype or a valuetype.
  bool for_eventtype_;
  
  // Flag to branch in visit_factory() where we create a
  // finder or a factory.
  bool for_finder_;
  
  // Flag to short_circuit reifying if we are the base class of
  // ast_visitor_tmpl_module_ref.
  bool ref_only_;
};

#endif // TAO_AST_VISITOR_TMPL_MODULE_INST_H