lestes::lang::cplus::sem::lu_lookup Class Reference

#include <lu_lu.g.hh>

Inheritance diagram for lestes::lang::cplus::sem::lu_lookup:

lestes::lang::cplus::sem::ss_declaration_default_visitor lestes::lang::cplus::sem::ss_declaration_visitor lestes::std::visitor_base lestes::std::object lestes::std::mem::keystone List of all members.

Public Member Functions

ptr< lu_paramsparams_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_typevisited_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_typelookup_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_typemain (ptr< ss_decl_seq > seq, ptr< lu_params > params)
ptr< declaration_set_typeinternal_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_typedeep_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_typelookup_by_decl (const ptr< ::lestes::lang::cplus::sem::ss_declaration > &)
 "visit-return" method
virtual ptr< reflection_listreflection_get () const
 for purposes of dumping
virtual ptr< field_list_listfield_values_get () const
 for purposes of dumping

Static Public Member Functions

static ptr< declaration_set_typesimple_scan (ptr< ss_decl_seq > seq, ptr< lu_params > params)
 Used internally, but can be used from outside as well.
static ptr< lu_lookupinstance ()
 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_paramsparams
 Used internally by the visitor; holds the parameters of the lookup.
srp< decl_seq_set_typevisited_seqs
 Used internally by the visitor; holds decl_seqs already visited during current invocation of the 'main' method.
srp< declaration_set_typelookup_result

Static Private Attributes

static ptr< reflection_listreflection = reflection
static ptr< lu_lookupthe_instance = the_instance

Detailed Description

Definition at line 121 of file lu_lu.g.hh.


Constructor & Destructor Documentation

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.

Author:
lsg

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 {}


Member Function Documentation

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.

Returns:
The value of lu_lookup::params.
Author:
lsg

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.

Parameters:
[in] x The new value to set lu_lookup::params to.
Author:
lsg

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.

Returns:
The value of lu_lookup::visited_seqs.
Author:
lsg

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.

Parameters:
[in] x The new value to set lu_lookup::visited_seqs to.
Author:
lsg

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.

Returns:
The value of lu_lookup::lookup_result.
Author:
lsg

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.

Parameters:
[in] x The new value to set lu_lookup::lookup_result to.
Author:
lsg

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]

Implements lestes::lang::cplus::sem::ss_declaration_default_visitor.

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.

Author:
lsg

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.

Author:
lsg

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 }


Member Data Documentation

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.

Author:
lsg

Definition at line 192 of file lu_lu.g.hh.

Referenced by instance().


The documentation for this class was generated from the following files:
Generated on Mon Feb 12 18:24:56 2007 for lestes by doxygen 1.5.1-20070107