lu_filter.cc

Go to the documentation of this file.
00001 /*
00002    The lestes compiler suite
00003    Copyright (C) 2002, 2003, 2004, 2005 Miroslav Tichy
00004    Copyright (C) 2002, 2003, 2004, 2005 Petr Zika
00005    Copyright (C) 2002, 2003, 2004, 2005 Vojtech Hala
00006    Copyright (C) 2002, 2003, 2004, 2005 Jiri Kosina
00007    Copyright (C) 2002, 2003, 2004, 2005 Pavel Sanda
00008    Copyright (C) 2002, 2003, 2004, 2005 Jan Zouhar
00009    Copyright (C) 2002, 2003, 2004, 2005 Rudolf Thomas
00010 
00011    This program is free software; you can redistribute it and/or modify
00012    it under the terms of the GNU General Public License as published by
00013    the Free Software Foundation; version 2 of the License.
00014 
00015    This program is distributed in the hope that it will be useful,
00016    but WITHOUT ANY WARRANTY; without even the implied warranty of
00017    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018    GNU General Public License for more details.
00019 
00020    See the full text of the GNU General Public License version 2, and
00021    the limitations in the file doc/LICENSE.
00022 
00023    By accepting the license the licensee waives any and all claims
00024    against the copyright holder(s) related in whole or in part to the
00025    work, its use, and/or the inability to use it.
00026  
00027  */
00028 #include <lestes/lang/cplus/sem/lu_filter.g.hh>
00029 #include <lestes/lang/cplus/sem/ss_decl_name.g.hh>
00030 #include <lestes/lang/cplus/sem/ss_declaration.g.hh>
00031 #include <lestes/lang/cplus/sem/ss_misc.g.hh>
00032 
00033 package(lestes);
00034 package(lang);
00035 package(cplus);
00036 package(sem);
00037 
00038 lstring lu_filter::result2lstring( result_type result )
00039 {
00040         switch (result) {
00041         case FR_NO:
00042                 return "FR_NO";
00043         case FR_YES:
00044                 return "FR_YES";
00045         case FR_YES_CONT:
00046                 return "FR_YES_CONT";
00047         }
00048         lassert(false);
00049 }
00050 
00051 void lu_yes_cont_filter::default_action( ptr<ss_declaration> )
00052 {
00053         result_set( FR_YES_CONT );
00054 }
00055 
00056 void lu_yes_filter::default_action( ptr<ss_declaration> )
00057 {
00058         result_set( FR_YES );
00059 }
00060 
00061 void lu_name_filter::default_action( ptr<ss_declaration> d )
00062 {
00063         if (d->name_get()->matches( name_get() ))
00064                 result_set( FR_YES_CONT );
00065         else
00066                 result_set( FR_NO );
00067 }
00068 
00069 void lu_visible_filter::default_action( ptr<ss_declaration> d )
00070 {
00071         // FIXME: visibility is ignored for now; remove following line when times are implemented
00072         return result_set( FR_YES_CONT );
00073 
00074         if (d->visible_since_get()->is_before( visible_before_get() ))
00075                 result_set( FR_YES_CONT );
00076         else
00077                 result_set( FR_NO );
00078 }
00079 
00080 void lu_multi_filter::default_action( ptr<ss_declaration> d )
00081 {
00082         result_type partial = FR_YES_CONT;
00083         for ( list< srp<lu_filter> >::const_iterator it = filter_list_get()->begin();
00084                         partial != FR_NO && it != filter_list_get()->end(); ++it ) {
00085 
00086                 result_type local = (*it)->filter(d);
00087                 // quit with FR_NO after first FR_NO
00088                 // after first FR_YES, downgrade from FR_YES_CONT to FR_YES
00089                 if (local != FR_YES_CONT)
00090                         partial = local;
00091         }
00092         result_set(partial);
00093 }
00094 
00095 void lu_multi_filter::add_filter( ptr<lu_filter> f )
00096 {
00097         filter_list_get()->push_back(f);
00098 }
00099 
00100 void lu_struct_filter::default_action( ptr<ss_declaration> )
00101 {
00102         result_set( FR_NO );
00103 }
00104 
00105 void lu_struct_filter::visit_ss_structure_declaration( ptr< ss_structure_declaration > )
00106 {
00107         result_set( FR_YES_CONT );
00108 }
00109 
00110 void lu_namespace_filter::default_action( ptr<ss_declaration> )
00111 {
00112         result_set( FR_NO );
00113 }
00114 
00115 void lu_namespace_filter::visit_ss_namespace_definition( ptr< ss_namespace_definition > )
00116 {
00117         result_set( FR_YES );
00118 }
00119 
00120 void lu_elaborated_filter::default_action( ptr< ss_declaration > )
00121 {
00122         result_set( FR_NO );
00123 }
00124 
00125 void lu_elaborated_filter::visit_ss_injected_class_declaration( ptr< ss_injected_class_declaration > )
00126 {
00127         result_set( FR_YES );
00128         // FIXME: yes, but ill-formed
00129 }
00130 
00131 void lu_elaborated_filter::visit_ss_enum_definition( ptr< ss_enum_definition > )
00132 {
00133         result_set( FR_YES );
00134 }
00135 
00136 void lu_elaborated_filter::visit_ss_typedef_definition( ptr< ss_typedef_definition > )
00137 {
00138         result_set( FR_YES );
00139         // FIXME: yes, but ill-formed
00140 }
00141 
00142 void lu_elaborated_filter::visit_ss_structure_declaration( ptr< ss_structure_declaration > )
00143 {
00144         result_set( FR_YES );
00145 }
00146 
00147 void lu_elaborated_filter::visit_ss_using_declaration( ptr< ss_using_declaration > )
00148 {
00149         lassert( false );
00150 }
00151 
00152 void lu_func_cont_filter::default_action( ptr< ss_declaration > )
00153 {
00154         result_set( FR_YES );
00155 }
00156 
00157 void lu_func_cont_filter::visit_ss_function_declaration( ptr< ss_function_declaration > )
00158 {
00159         result_set( FR_YES_CONT );
00160 }
00161 
00162 void lu_func_cont_filter::visit_ss_method_declaration( ptr< ss_method_declaration > )
00163 {
00164         result_set( FR_YES_CONT );
00165 }
00166 
00167 void lu_func_cont_filter::visit_ss_builtin_operator_declaration( ptr< ss_builtin_operator_declaration > )
00168 {
00169         result_set( FR_YES_CONT );
00170 }
00171 
00172 void lu_qual_filter::default_action( ptr< ss_declaration > )
00173 {
00174         result_set( FR_YES_CONT );
00175 }
00176 
00177 void lu_qual_filter::visit_ss_object_declaration( ptr< ss_object_declaration > )
00178 {
00179         result_set( FR_NO );
00180 }
00181 
00182 void lu_qual_filter::visit_ss_bitfield_declaration( ptr< ss_bitfield_declaration > )
00183 {
00184         result_set( FR_NO );
00185 }
00186 
00187 void lu_qual_filter::visit_ss_parameter_declaration( ptr< ss_parameter_declaration > )
00188 {
00189         result_set( FR_NO );
00190 }
00191 
00192 void lu_qual_filter::visit_ss_fake_declaration( ptr< ss_fake_declaration > )
00193 {
00194         result_set( FR_NO );
00195 }
00196 
00197 void lu_qual_filter::visit_ss_enumerator_declaration( ptr< ss_enumerator_declaration > )
00198 {
00199         result_set( FR_NO );
00200 }
00201 
00202 void lu_qual_filter::visit_ss_function_declaration( ptr< ss_function_declaration > )
00203 {
00204         result_set( FR_NO );
00205 }
00206 
00207 void lu_qual_filter::visit_ss_method_declaration( ptr< ss_method_declaration > )
00208 {
00209         result_set( FR_NO );
00210 }
00211 
00212 void lu_qual_filter::visit_ss_builtin_operator_declaration( ptr< ss_builtin_operator_declaration > )
00213 {
00214         result_set( FR_NO );
00215 }
00216 
00217 /*!
00218   Default action for non-secu declarations.
00219   Sets result to reject.
00220 */
00221 void lu_secu_filter::default_action(ptr<ss_declaration>)
00222 {
00223         result_set(FR_NO);
00224 }
00225 
00226 /*!
00227   Visits injected class declaration.
00228   Sets result to accept.
00229 */
00230 void lu_secu_filter::visit_ss_injected_class_declaration(ptr<ss_injected_class_declaration>)
00231 {
00232         result_set(FR_YES_CONT);
00233 }
00234 
00235 /*!
00236   Visits enumeration definition.
00237   Sets result to accept.
00238 */
00239 void lu_secu_filter::visit_ss_enum_definition(ptr<ss_enum_definition>)
00240 {
00241         result_set(FR_YES_CONT);
00242 }
00243 
00244 /*!
00245   Visits structure declaration.
00246   Sets result to accept.
00247 */
00248 void lu_secu_filter::visit_ss_structure_declaration(ptr<ss_structure_declaration>)
00249 {
00250         result_set(FR_YES_CONT);
00251 }
00252 
00253 /*!
00254   Inverts the result of applying the contained filter on the declaration.
00255   \param declaration  The declaration to filter.
00256 */
00257 void lu_inversion_filter::default_action(ptr<ss_declaration> declaration)
00258 {
00259         result_type r = inverted->filter(declaration);
00260         if (r == FR_NO)
00261                 result_set(FR_YES);
00262         else
00263                 result_set(FR_NO);
00264 }
00265 
00266 #if 0
00267 void lu_filter::visit_ss_namespace_definition( ptr< ss_namespace_definition > )
00268 {
00269         lassert( false );
00270 }
00271 
00272 void lu_filter::visit_ss_object_declaration( ptr< ss_object_declaration > )
00273 {
00274         lassert( false );
00275 }
00276 
00277 void lu_filter::visit_ss_bitfield_declaration( ptr< ss_bitfield_declaration > )
00278 {
00279         lassert( false );
00280 }
00281 
00282 void lu_filter::visit_ss_parameter_declaration( ptr< ss_parameter_declaration > )
00283 {
00284         lassert( false );
00285 }
00286 
00287 void lu_filter::visit_ss_fake_declaration( ptr< ss_fake_declaration > )
00288 {
00289         lassert( false );
00290 }
00291 
00292 void lu_filter::visit_ss_injected_class_declaration( ptr< ss_injected_class_declaration > )
00293 {
00294         lassert( false );
00295 }
00296 
00297 void lu_filter::visit_ss_enum_definition( ptr< ss_enum_definition > )
00298 {
00299         lassert( false );
00300 }
00301 
00302 void lu_filter::visit_ss_typedef_definition( ptr< ss_typedef_definition > )
00303 {
00304         lassert( false );
00305 }
00306 
00307 void lu_filter::visit_ss_enumerator_declaration( ptr< ss_enumerator_declaration > )
00308 {
00309         lassert( false );
00310 }
00311 
00312 void lu_filter::visit_ss_structure_declaration( ptr< ss_structure_declaration > )
00313 {
00314         lassert( false );
00315 }
00316 
00317 void lu_filter::visit_ss_function_declaration( ptr< ss_function_declaration > )
00318 {
00319         lassert( false );
00320 }
00321 
00322 void lu_filter::visit_ss_method_declaration( ptr< ss_method_declaration > )
00323 {
00324         lassert( false );
00325 }
00326 
00327 void lu_filter::visit_ss_using_declaration( ptr< ss_using_declaration > )
00328 {
00329         lassert( false );
00330 }
00331 
00332 void lu_filter::visit_ss_compound_stmt_declaration( ptr< ss_compound_stmt_declaration > )
00333 {
00334         lassert( false );
00335 }
00336 
00337 void lu_filter::visit_ss_builtin_operator_declaration( ptr< ss_builtin_operator_declaration > )
00338 {
00339         lassert( false );
00340 }
00341 
00342 #endif
00343 
00344 end_package(sem);
00345 end_package(cplus);
00346 end_package(lang);
00347 end_package(lestes);
00348 

Generated on Mon Feb 12 18:22:38 2007 for lestes by doxygen 1.5.1-20070107