00001
00002
00003 #ifndef lestes__lang__cplus__sem__lu_lu_g_hh__included
00004 #define lestes__lang__cplus__sem__lu_lu_g_hh__included
00005
00006 #include <lestes/common.hh>
00007 #include <lestes/lang/cplus/sem/lu_typedef.hh>
00008 #include <lestes/lang/cplus/sem/ss_declaration_visitor.v.g.hh>
00009 #include <lestes/lang/cplus/sem/ss_type_visitor.v.g.hh>
00010 #include <lestes/std/set.hh>
00011
00012 #include <lestes/std/objectize_macros.hh>
00013 package(lestes);
00014 package(std);
00015 class object;
00016 end_package(std);
00017 end_package(lestes);
00018
00019 package(lestes);
00020 package(lang);
00021 package(cplus);
00022 package(sem);
00023
00024
00025 class ss_decl_seq;
00026 class ss_declaration_time;
00027 class ss_type;
00028 class lu_filter;
00029 class lu_params;
00030 class lu_lookup;
00031 class lu_lookup_in_type;
00032
00033
00034 class lu_params : public ::lestes::std::object {
00035 public:
00036 enum using_directives_handling_type {
00037 UDIR_IGNORE,
00038 UDIR_ALWAYS,
00039 UDIR_FALLBACK
00040 };
00041 enum using_declarations_handling_type {
00042 UDECL_IGNORE,
00043 UDECL_THROUGH,
00044 UDECL_RESOLVE_BEFORE_FILTER,
00045 UDECL_RESOLVE_AFTER_FILTER
00046 };
00047 enum parent_search_type {
00048 SEARCH_PARENTS,
00049 SKIP_PARENTS
00050 };
00051
00052
00053 using_directives_handling_type using_directives_handling_get() const;
00054
00055
00056 void using_directives_handling_set(using_directives_handling_type);
00057
00058
00059 using_declarations_handling_type using_declarations_handling_get() const;
00060
00061
00062 void using_declarations_handling_set(using_declarations_handling_type);
00063
00064
00065 parent_search_type parent_search_get() const;
00066
00067
00068 void parent_search_set(parent_search_type);
00069
00070
00071 ptr< ss_declaration_time > time_get() const;
00072
00073
00074 void time_set(const ptr< ss_declaration_time > &);
00075
00076
00077 ptr< lu_filter > filter_get() const;
00078
00079
00080 void filter_set(const ptr< lu_filter > &);
00081
00082
00083
00084 static ptr< lu_params > create (
00085 using_directives_handling_type a__lu_params__using_directives_handling,
00086 using_declarations_handling_type a__lu_params__using_declarations_handling,
00087 parent_search_type a__lu_params__parent_search,
00088 ptr< ss_declaration_time > a__lu_params__time,
00089 ptr< lu_filter > a__lu_params__filter);
00090
00091
00092
00093
00094 virtual ptr<reflection_list> reflection_get() const;
00095
00096 virtual ptr<field_list_list> field_values_get() const;
00097
00098 protected:
00099
00100 lu_params (
00101 using_directives_handling_type a__lu_params__using_directives_handling,
00102 using_declarations_handling_type a__lu_params__using_declarations_handling,
00103 parent_search_type a__lu_params__parent_search,
00104 ptr< ss_declaration_time > a__lu_params__time,
00105 ptr< lu_filter > a__lu_params__filter);
00106
00107
00108 virtual void gc_mark();
00109
00110 private:
00111 using_directives_handling_type using_directives_handling;
00112 using_declarations_handling_type using_declarations_handling;
00113 parent_search_type parent_search;
00114 srp< ss_declaration_time > time;
00115 srp< lu_filter > filter;
00116 static ptr<reflection_list> reflection;
00117
00118 };
00119
00120
00121 class lu_lookup : public ss_declaration_default_visitor {
00122 public:
00123
00124 ptr< lu_params > params_get() const;
00125
00126
00127 void params_set(const ptr< lu_params > &);
00128
00129
00130 ptr< decl_seq_set_type > visited_seqs_get() const;
00131
00132
00133 void visited_seqs_set(const ptr< decl_seq_set_type > &);
00134
00135
00136 ptr< declaration_set_type > lookup_result_get() const;
00137
00138
00139 void lookup_result_set(const ptr< declaration_set_type > &);
00140
00141 ptr< declaration_set_type > main(ptr< ss_decl_seq > seq, ptr< lu_params > params);
00142
00143
00144 static ptr< declaration_set_type > simple_scan(ptr< ss_decl_seq > seq, ptr< lu_params > params);
00145
00146
00147 ptr< declaration_set_type > internal_simple_scan(ptr< ss_decl_seq > seq);
00148
00149
00150 ptr< declaration_set_type > deep_scan(ptr< ss_decl_seq > starting_seq);
00151
00152 virtual void default_action(ptr< ::lestes::lang::cplus::sem::ss_declaration > );
00153
00154 virtual void visit_ss_namespace_definition(ptr< ::lestes::lang::cplus::sem::ss_namespace_definition > );
00155
00156 virtual void visit_ss_function_declaration(ptr< ::lestes::lang::cplus::sem::ss_function_declaration > );
00157
00158 virtual void visit_ss_compound_stmt_declaration(ptr< ::lestes::lang::cplus::sem::ss_compound_stmt_declaration > );
00159
00160 virtual void visit_ss_structure_declaration(ptr< ::lestes::lang::cplus::sem::ss_structure_declaration > );
00161
00162
00163
00164 static ptr< lu_lookup > instance ();
00165
00166
00167
00168 ptr< declaration_set_type > lookup_by_decl( const ptr< ::lestes::lang::cplus::sem::ss_declaration > & );
00169
00170
00171 virtual ptr<reflection_list> reflection_get() const;
00172
00173 virtual ptr<field_list_list> field_values_get() const;
00174
00175 protected:
00176
00177 lu_lookup (
00178 ptr< lu_params > a__lu_lookup__params,
00179 ptr< decl_seq_set_type > a__lu_lookup__visited_seqs,
00180 ptr< declaration_set_type > a__lu_lookup__lookup_result);
00181
00182
00183 virtual void gc_mark();
00184
00185 private:
00186
00187 srp< lu_params > params;
00188
00189 srp< decl_seq_set_type > visited_seqs;
00190 srp< declaration_set_type > lookup_result;
00191 static ptr<reflection_list> reflection;
00192 static ptr<lu_lookup> the_instance;
00193
00194 };
00195
00196
00197 class lu_lookup_in_type : public ss_type_default_visitor {
00198 public:
00199
00200 ptr< lu_params > params_get() const;
00201
00202
00203 void params_set(const ptr< lu_params > &);
00204
00205
00206 ptr< declaration_set_type > lookup_result_get() const;
00207
00208
00209 void lookup_result_set(const ptr< declaration_set_type > &);
00210
00211 ptr< declaration_set_type > main(ptr< ss_type > type, ptr< lu_params > params);
00212
00213
00214 ptr< declaration_set_type > internal_simple_scan(ptr< ss_decl_seq > seq);
00215
00216 virtual void default_action(ptr< ::lestes::lang::cplus::sem::ss_type > );
00217
00218 virtual void visit_ss_class(ptr< ::lestes::lang::cplus::sem::ss_class > );
00219
00220 virtual void visit_ss_union(ptr< ::lestes::lang::cplus::sem::ss_union > );
00221
00222
00223
00224 static ptr< lu_lookup_in_type > instance ();
00225
00226
00227
00228 ptr< declaration_set_type > lookup_by_type( const ptr< ::lestes::lang::cplus::sem::ss_type > & );
00229
00230
00231 virtual ptr<reflection_list> reflection_get() const;
00232
00233 virtual ptr<field_list_list> field_values_get() const;
00234
00235 protected:
00236
00237 lu_lookup_in_type (
00238 ptr< lu_params > a__lu_lookup_in_type__params,
00239 ptr< declaration_set_type > a__lu_lookup_in_type__lookup_result);
00240
00241
00242 virtual void gc_mark();
00243
00244 private:
00245
00246 srp< lu_params > params;
00247 srp< declaration_set_type > lookup_result;
00248 static ptr<reflection_list> reflection;
00249 static ptr<lu_lookup_in_type> the_instance;
00250
00251 };
00252
00253
00254 end_package(sem);
00255 end_package(cplus);
00256 end_package(lang);
00257 end_package(lestes);
00258
00259 package(lestes);
00260 package(std);
00261 specialize_objectize_for_enum( ::lestes::lang::cplus::sem::lu_params::using_directives_handling_type );
00262 specialize_objectize_for_enum( ::lestes::lang::cplus::sem::lu_params::using_declarations_handling_type );
00263 specialize_objectize_for_enum( ::lestes::lang::cplus::sem::lu_params::parent_search_type );
00264 end_package(std);
00265 end_package(lestes);
00266
00267 #endif // lestes__lang__cplus__sem__lu_lu_g_hh__included