#include <lu_lu.g.hh>
Inheritance diagram for lestes::lang::cplus::sem::lu_lookup:

Public Member Functions | |
| ptr< lu_params > | params_get () const |
| The method params_get returns the value of the field lu_lookup::params. | |
| void | params_set (const ptr< lu_params > &) |
| The method params_set sets the field lu_lookup::params to the given value. | |
| ptr< decl_seq_set_type > | visited_seqs_get () const |
| The method visited_seqs_get returns the value of the field lu_lookup::visited_seqs. | |
| void | visited_seqs_set (const ptr< decl_seq_set_type > &) |
| The method visited_seqs_set sets the field lu_lookup::visited_seqs to the given value. | |
| ptr< declaration_set_type > | lookup_result_get () const |
| The method lookup_result_get returns the value of the field lu_lookup::lookup_result. | |
| void | lookup_result_set (const ptr< declaration_set_type > &) |
| The method lookup_result_set sets the field lu_lookup::lookup_result to the given value. | |
| ptr< declaration_set_type > | main (ptr< ss_decl_seq > seq, ptr< lu_params > params) |
| ptr< declaration_set_type > | internal_simple_scan (ptr< ss_decl_seq > seq) |
| Used internally, just a wrapper around simple_scan() that adds params to the argument list. | |
| ptr< declaration_set_type > | deep_scan (ptr< ss_decl_seq > starting_seq) |
| Used internally; scans given decl_seq and its using-directives using params. | |
| virtual void | default_action (ptr< ::lestes::lang::cplus::sem::ss_declaration >) |
| virtual void | visit_ss_namespace_definition (ptr< ::lestes::lang::cplus::sem::ss_namespace_definition >) |
| virtual void | visit_ss_function_declaration (ptr< ::lestes::lang::cplus::sem::ss_function_declaration >) |
| virtual void | visit_ss_compound_stmt_declaration (ptr< ::lestes::lang::cplus::sem::ss_compound_stmt_declaration >) |
| virtual void | visit_ss_structure_declaration (ptr< ::lestes::lang::cplus::sem::ss_structure_declaration >) |
| ptr< declaration_set_type > | lookup_by_decl (const ptr< ::lestes::lang::cplus::sem::ss_declaration > &) |
| "visit-return" method | |
| virtual ptr< reflection_list > | reflection_get () const |
| for purposes of dumping | |
| virtual ptr< field_list_list > | field_values_get () const |
| for purposes of dumping | |
Static Public Member Functions | |
| static ptr< declaration_set_type > | simple_scan (ptr< ss_decl_seq > seq, ptr< lu_params > params) |
| Used internally, but can be used from outside as well. | |
| static ptr< lu_lookup > | instance () |
| Generated instance() method for singleton class lu_lookup. | |
Protected Member Functions | |
| lu_lookup (ptr< lu_params > a__lu_lookup__params, ptr< decl_seq_set_type > a__lu_lookup__visited_seqs, ptr< declaration_set_type > a__lu_lookup__lookup_result) | |
| Generated constructor for class lu_lookup. | |
| virtual void | gc_mark () |
| Marking routine for class lu_lookup. | |
Private Attributes | |
| srp< lu_params > | params |
| Used internally by the visitor; holds the parameters of the lookup. | |
| srp< decl_seq_set_type > | visited_seqs |
| Used internally by the visitor; holds decl_seqs already visited during current invocation of the 'main' method. | |
| srp< declaration_set_type > | lookup_result |
Static Private Attributes | |
| static ptr< reflection_list > | reflection = reflection |
| static ptr< lu_lookup > | the_instance = the_instance |
Definition at line 121 of file lu_lu.g.hh.
| lestes::lang::cplus::sem::lu_lookup::lu_lookup | ( | ptr< lu_params > | a__lu_lookup__params, | |
| ptr< decl_seq_set_type > | a__lu_lookup__visited_seqs, | |||
| ptr< declaration_set_type > | a__lu_lookup__lookup_result | |||
| ) | [protected] |
Generated constructor for class lu_lookup.
Generated constructor for class lu_lookup.
Definition at line 261 of file lu_lu.g.cc.
Referenced by instance().
00264 : ss_declaration_default_visitor(), params(a__lu_lookup__params), visited_seqs(a__lu_lookup__visited_seqs), lookup_result(a__lu_lookup__lookup_result) 00265 {}
| ptr< lu_params > lestes::lang::cplus::sem::lu_lookup::params_get | ( | ) | const |
The method params_get returns the value of the field lu_lookup::params.
Definition at line 192 of file lu_lu.g.cc.
References params.
Referenced by deep_scan(), internal_simple_scan(), and main().
00193 { 00194 return params; 00195 }
| void lestes::lang::cplus::sem::lu_lookup::params_set | ( | const ptr< lu_params > & | x | ) |
The method params_set sets the field lu_lookup::params to the given value.
| [in] | x | The new value to set lu_lookup::params to. |
Definition at line 201 of file lu_lu.g.cc.
References params.
Referenced by main().
00202 { 00203 lu_lookup::params = x; 00204 }
| ptr< decl_seq_set_type > lestes::lang::cplus::sem::lu_lookup::visited_seqs_get | ( | ) | const |
The method visited_seqs_get returns the value of the field lu_lookup::visited_seqs.
Definition at line 210 of file lu_lu.g.cc.
References visited_seqs.
Referenced by deep_scan(), and main().
00211 { 00212 return visited_seqs; 00213 }
| void lestes::lang::cplus::sem::lu_lookup::visited_seqs_set | ( | const ptr< decl_seq_set_type > & | x | ) |
The method visited_seqs_set sets the field lu_lookup::visited_seqs to the given value.
| [in] | x | The new value to set lu_lookup::visited_seqs to. |
Definition at line 219 of file lu_lu.g.cc.
References visited_seqs.
Referenced by main().
00220 { 00221 lu_lookup::visited_seqs = x; 00222 }
| ptr< declaration_set_type > lestes::lang::cplus::sem::lu_lookup::lookup_result_get | ( | ) | const |
The method lookup_result_get returns the value of the field lu_lookup::lookup_result.
Definition at line 228 of file lu_lu.g.cc.
References lookup_result.
Referenced by lookup_by_decl().
00229 { 00230 return lookup_result; 00231 }
| void lestes::lang::cplus::sem::lu_lookup::lookup_result_set | ( | const ptr< declaration_set_type > & | x | ) |
The method lookup_result_set sets the field lu_lookup::lookup_result to the given value.
| [in] | x | The new value to set lu_lookup::lookup_result to. |
Definition at line 237 of file lu_lu.g.cc.
References lookup_result.
00238 { 00239 lu_lookup::lookup_result = x; 00240 }
| ptr< declaration_set_type > lestes::lang::cplus::sem::lu_lookup::main | ( | ptr< ss_decl_seq > | seq, | |
| ptr< lu_params > | params | |||
| ) |
Not reentrant! Never returns NULL.
Definition at line 83 of file lu_lu.cc.
References deep_scan(), lassert, lassert2, params_get(), params_set(), lestes::lang::cplus::sem::ss_decl_seq::root_instance(), lestes::lang::cplus::sem::lu_params::SEARCH_PARENTS, visited_seqs, visited_seqs_get(), and visited_seqs_set().
00084 { 00085 lassert( !params_get() && !visited_seqs ); 00086 lassert2( params, "Lookup parameters must not be NULL." ); 00087 00088 visited_seqs_set( decl_seq_set_type::create() ); 00089 params_set( params ); 00090 00091 bool search_parents = params->parent_search_get() == lu_params::SEARCH_PARENTS; 00092 ptr<declaration_set_type> result; 00093 do { 00094 bool not_yet_visited = visited_seqs_get()->insert(seq).second; 00095 if (not_yet_visited) 00096 result = deep_scan( seq ); 00097 lassert2( result, "The very first decl_seq has been marked as already visited!" ); 00098 if (seq == ss_decl_seq::root_instance()) 00099 break; 00100 seq = seq->parent_get(); 00101 } while (result->empty() && search_parents); 00102 00103 params_set( NULL ); 00104 visited_seqs_set( NULL ); 00105 return result; 00106 }
| ptr< declaration_set_type > lestes::lang::cplus::sem::lu_lookup::simple_scan | ( | ptr< ss_decl_seq > | seq, | |
| ptr< lu_params > | params | |||
| ) | [static] |
Used internally, but can be used from outside as well.
Definition at line 176 of file lu_lu.cc.
References lestes::lang::cplus::sem::lu_filter::FR_NO, lestes::lang::cplus::sem::lu_filter::FR_YES, lestes::lang::cplus::sem::ss_using_target::instance(), lassert, llog, lestes::lang::cplus::sem::lu_filter::result2lstring(), lestes::lang::cplus::sem::lu_params::UDECL_IGNORE, lestes::lang::cplus::sem::lu_params::UDECL_RESOLVE_AFTER_FILTER, lestes::lang::cplus::sem::lu_params::UDECL_RESOLVE_BEFORE_FILTER, and lestes::lang::cplus::sem::lu_params::UDECL_THROUGH.
Referenced by lestes::lang::cplus::sem::lu_lookup_in_type::internal_simple_scan(), and internal_simple_scan().
00177 { 00178 ptr<declaration_set_type> result = declaration_set_type::create(); 00179 typedef list< srp<ss_declaration> > contents_type; 00180 const srp<contents_type> & contents = seq->contents_get(); 00181 00182 for ( contents_type::reverse_iterator it = contents->rbegin(); 00183 it != contents->rend(); ++it ) { 00184 00185 ptr<ss_declaration> decl = *it; 00186 ptr<ss_declaration> real_decl; 00187 00188 /* skip declarations that are too young */ 00189 if (!decl->decl_time_get()->is_before( params->time_get() )) 00190 continue; 00191 00192 lu_params::using_declarations_handling_type udecl_handling = 00193 params->using_declarations_handling_get(); 00194 if (udecl_handling != lu_params::UDECL_THROUGH) { 00195 /* handle using declaration, as requested */ 00196 real_decl = ss_using_target::instance()->process(decl); 00197 if (decl != real_decl) { 00198 /* it was ss_using_declaration */ 00199 switch (udecl_handling) { 00200 case lu_params::UDECL_IGNORE: 00201 continue; 00202 case lu_params::UDECL_RESOLVE_BEFORE_FILTER: 00203 decl = real_decl; 00204 break; 00205 default: 00206 /* udecl_handling == UDECL_RESOLVE_AFTER_FILTER */ 00207 break; 00208 } 00209 } 00210 } 00211 00212 llog(lookup_log) << "calling filter on decl #" << decl->uid_get() << "\n"; 00213 00214 lu_filter::result_type filt = params->filter_get()->filter(decl); 00215 00216 llog(lookup_log) << "got result " << lu_filter::result2lstring(filt) << "\n"; 00217 00218 if (filt == lu_filter::FR_NO) 00219 continue; 00220 00221 if (udecl_handling == lu_params::UDECL_RESOLVE_AFTER_FILTER) { 00222 lassert( real_decl ); 00223 decl = real_decl; 00224 } 00225 00226 result->insert( decl ); 00227 00228 if (filt == lu_filter::FR_YES) 00229 break; 00230 } 00231 return result; 00232 }
| ptr< declaration_set_type > lestes::lang::cplus::sem::lu_lookup::internal_simple_scan | ( | ptr< ss_decl_seq > | seq | ) |
Used internally, just a wrapper around simple_scan() that adds params to the argument list.
Definition at line 234 of file lu_lu.cc.
References params_get(), and simple_scan().
00235 { 00236 return simple_scan( seq, params_get() ); 00237 }
| ptr< declaration_set_type > lestes::lang::cplus::sem::lu_lookup::deep_scan | ( | ptr< ss_decl_seq > | starting_seq | ) |
Used internally; scans given decl_seq and its using-directives using params.
Never returns NULL.
Definition at line 124 of file lu_lu.cc.
References lookup_by_decl(), params_get(), lestes::lang::cplus::sem::seq_param, lestes::lang::cplus::sem::lu_params::UDIR_ALWAYS, lestes::lang::cplus::sem::lu_params::UDIR_FALLBACK, lestes::lang::cplus::sem::lu_params::UDIR_IGNORE, lestes::lang::cplus::sem::unify(), and visited_seqs_get().
Referenced by main().
00125 { 00126 typedef list< srp<ss_decl_seq> > queue_type; 00127 typedef list< srp<ss_using_directive> > directives_type; 00128 00129 ptr<declaration_set_type> result = declaration_set_type::create(); 00130 00131 ptr<queue_type> queue = queue_type::create(); 00132 // starting_seq is already marked as visited in 'main' 00133 queue->push_back( starting_seq ); 00134 00135 while (!queue->empty()) { 00136 ptr<ss_decl_seq> seq = queue->front(); 00137 queue->pop_front(); 00138 #ifdef LOOKUP_ASSERTIONS 00139 // assertions are in the visit methods called from lookup_by_decl() 00140 seq_param = seq; 00141 #endif 00142 ptr<declaration_set_type> local_result = lookup_by_decl( seq->declared_by_get() ); 00143 00144 result = unify( result, local_result ); 00145 00146 switch (params_get()->using_directives_handling_get()) { 00147 case lu_params::UDIR_IGNORE: 00148 continue; 00149 case lu_params::UDIR_FALLBACK: 00150 if (!local_result->empty()) 00151 continue; 00152 /* fall-through */ 00153 case lu_params::UDIR_ALWAYS: 00154 ; 00155 /* fall-through */ 00156 } 00157 00158 const ptr<directives_type> & directives = seq->using_directives_get(); 00159 for ( directives_type::const_iterator it = directives->begin(); it != directives->end(); ++it ) { 00160 /* 00161 * XXX: 00162 * we assume that all using-directives that follow a late one are late too 00163 * therefore we can break 00164 */ 00165 if (!(*it)->decl_time_get()->is_before( params_get()->time_get() )) 00166 break; 00167 const ptr<ss_decl_seq> & used_seq = (*it)->nspace_get()->body_get(); 00168 bool not_yet_visited = visited_seqs_get()->insert(used_seq).second; 00169 if (not_yet_visited) 00170 queue->push_back(used_seq); 00171 } 00172 } 00173 return result; 00174 }
| virtual void lestes::lang::cplus::sem::lu_lookup::default_action | ( | ptr< ::lestes::lang::cplus::sem::ss_declaration > | ) | [virtual] |
| virtual void lestes::lang::cplus::sem::lu_lookup::visit_ss_namespace_definition | ( | ptr< ::lestes::lang::cplus::sem::ss_namespace_definition > | ) | [virtual] |
Reimplemented from lestes::lang::cplus::sem::ss_declaration_default_visitor.
| virtual void lestes::lang::cplus::sem::lu_lookup::visit_ss_function_declaration | ( | ptr< ::lestes::lang::cplus::sem::ss_function_declaration > | ) | [virtual] |
Reimplemented from lestes::lang::cplus::sem::ss_declaration_default_visitor.
| virtual void lestes::lang::cplus::sem::lu_lookup::visit_ss_compound_stmt_declaration | ( | ptr< ::lestes::lang::cplus::sem::ss_compound_stmt_declaration > | ) | [virtual] |
Reimplemented from lestes::lang::cplus::sem::ss_declaration_default_visitor.
| virtual void lestes::lang::cplus::sem::lu_lookup::visit_ss_structure_declaration | ( | ptr< ::lestes::lang::cplus::sem::ss_structure_declaration > | ) | [virtual] |
Reimplemented from lestes::lang::cplus::sem::ss_declaration_default_visitor.
| ptr< lu_lookup > lestes::lang::cplus::sem::lu_lookup::instance | ( | void | ) | [static] |
Generated instance() method for singleton class lu_lookup.
Generated instance() method for singleton class lu_lookup.
Definition at line 252 of file lu_lu.g.cc.
References lu_lookup(), and the_instance.
00253 { 00254 return the_instance ? the_instance : the_instance = new lu_lookup(NULL, NULL, NULL); 00255 }
| ptr< declaration_set_type > lestes::lang::cplus::sem::lu_lookup::lookup_by_decl | ( | const ptr< ::lestes::lang::cplus::sem::ss_declaration > & | ) |
"visit-return" method
Definition at line 294 of file lu_lu.g.cc.
References lassert2, and lookup_result_get().
Referenced by deep_scan().
00295 { 00296 lassert2( o, "Cannot visit NULL object." ); 00297 o->accept_ss_declaration_visitor( ptr< ss_declaration_visitor >(this) ); 00298 return lookup_result_get(); 00299 }
| ptr< object::reflection_list > lestes::lang::cplus::sem::lu_lookup::reflection_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::lang::cplus::sem::ss_declaration_default_visitor.
Definition at line 267 of file lu_lu.g.cc.
References lestes::std::list< T >::create(), reflection, and lestes::lang::cplus::sem::ss_declaration_default_visitor::reflection_get().
00268 { 00269 if (!reflection) { 00270 typedef class_reflection::field_metadata md; 00271 typedef class_reflection::field_metadata_list mdlist; 00272 ptr<mdlist> mdl = mdlist::create(); 00273 mdl->push_back( md::create( "params", "lu_params" ) ); 00274 mdl->push_back( md::create( "visited_seqs", "decl_seq_set_type" ) ); 00275 mdl->push_back( md::create( "lookup_result", "declaration_set_type" ) ); 00276 reflection = reflection_list::create( ss_declaration_default_visitor::reflection_get() ); 00277 reflection->push_back( class_reflection::create( "lu_lookup", mdl ) ); 00278 } 00279 return reflection; 00280 }
| ptr< object::field_list_list > lestes::lang::cplus::sem::lu_lookup::field_values_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::lang::cplus::sem::ss_declaration_default_visitor.
Definition at line 282 of file lu_lu.g.cc.
References lestes::std::list< T >::create(), and lestes::lang::cplus::sem::ss_declaration_default_visitor::field_values_get().
00283 { 00284 ptr < field_list_list > result = ss_declaration_default_visitor::field_values_get(); 00285 result->push_back( value_list::create() ); 00286 result->back()->push_back( this->params ); 00287 result->push_back( value_list::create() ); 00288 result->back()->push_back( this->visited_seqs ); 00289 result->push_back( value_list::create() ); 00290 result->back()->push_back( this->lookup_result ); 00291 return result; 00292 }
| void lestes::lang::cplus::sem::lu_lookup::gc_mark | ( | void | ) | [protected, virtual] |
Marking routine for class lu_lookup.
Marking routine is used for garbage collection.
Reimplemented from lestes::lang::cplus::sem::ss_declaration_default_visitor.
Definition at line 306 of file lu_lu.g.cc.
References lestes::lang::cplus::sem::ss_declaration_default_visitor::gc_mark().
00307 { 00308 ss_declaration_default_visitor::gc_mark(); 00309 }
srp< lu_params > lestes::lang::cplus::sem::lu_lookup::params [private] |
Used internally by the visitor; holds the parameters of the lookup.
Definition at line 187 of file lu_lu.g.hh.
Referenced by params_get(), and params_set().
srp< decl_seq_set_type > lestes::lang::cplus::sem::lu_lookup::visited_seqs [private] |
Used internally by the visitor; holds decl_seqs already visited during current invocation of the 'main' method.
Definition at line 189 of file lu_lu.g.hh.
Referenced by main(), visited_seqs_get(), and visited_seqs_set().
srp< declaration_set_type > lestes::lang::cplus::sem::lu_lookup::lookup_result [private] |
Definition at line 190 of file lu_lu.g.hh.
Referenced by lookup_result_get(), and lookup_result_set().
ptr< object::reflection_list > lestes::lang::cplus::sem::lu_lookup::reflection = reflection [static, private] |
Reimplemented from lestes::lang::cplus::sem::ss_declaration_default_visitor.
Definition at line 191 of file lu_lu.g.hh.
Referenced by reflection_get().
ptr< lu_lookup > lestes::lang::cplus::sem::lu_lookup::the_instance = the_instance [static, private] |
Static field lu_lookup::the_instance.
Definition at line 192 of file lu_lu.g.hh.
Referenced by instance().
1.5.1-20070107