[pygccxml-commit] SF.net SVN: pygccxml: [570] pyplusplus_dev/pyplusplus
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-09-21 09:51:19
|
Revision: 570 http://svn.sourceforge.net/pygccxml/?rev=570&view=rev Author: roman_yakovenko Date: 2006-09-21 02:51:06 -0700 (Thu, 21 Sep 2006) Log Message: ----------- adding support for associated_decl_creators to file writers Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_creator/creator.py Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-09-21 09:48:15 UTC (rev 569) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-09-21 09:51:06 UTC (rev 570) @@ -27,6 +27,8 @@ from declaration_based import declaration_based_t +from registration_based import registration_based_t + from scoped import scoped_t from module_body import module_body_t @@ -121,4 +123,4 @@ from exception_translator import exception_translator_t from exception_translator import exception_translator_register_t -from opaque_type_registrator import opaque_type_registrator_t \ No newline at end of file +from opaque_type_registrator import opaque_type_registrator_t Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-09-21 09:48:15 UTC (rev 569) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-09-21 09:51:06 UTC (rev 570) @@ -90,7 +90,6 @@ registration_based.registration_based_t.__init__( self ) self._wrapper = wrapper self.works_on_instance = False - self._associated_decl_creators = [] def _get_wrapper( self ): return self._wrapper @@ -98,11 +97,6 @@ self._wrapper = new_wrapper wrapper = property( _get_wrapper, _set_wrapper ) - @property - def associated_decl_creators( self ): - """ references to class declaration code creators. """ - return self._associated_decl_creators - def _get_held_type(self): return self.declaration.held_type def _set_held_type(self, held_type): Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-21 09:48:15 UTC (rev 569) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-21 09:51:06 UTC (rev 570) @@ -72,7 +72,7 @@ header_file = os.path.join( self.directory_path, self.wrapper_header(class_creator) ) self.write_file( header_file, wrapper_code ) - def split_internal_creators( self, class_creator, creators, pattern, decl_creators=None): + def split_internal_creators( self, class_creator, creators, pattern ): file_path = os.path.join( self.directory_path , self.create_base_fname( class_creator, pattern ) ) @@ -104,8 +104,8 @@ source_code.append( '' ) source_code.append( self.create_namespaces_code( creators ) ) - if decl_creators: - for decl_creator in decl_creators: + for creator in creators: + for decl_creator in self.associated_decl_creators( creator ): source_code.append( '' ) source_code.append( decl_creator.create() ) decl_creator.create = lambda: '' @@ -174,22 +174,12 @@ , code_creators.mem_fun_protected_s_t , code_creators.mem_fun_protected_v_t , code_creators.mem_fun_protected_pv_t ) - return self.split_internal_calldefs( class_creator, calldef_types, 'protected_memfuns' ) - def split_internal_classes( self, class_creator ): class_types = ( code_creators.class_t, code_creators.class_declaration_t ) creators = filter( lambda x: isinstance(x, class_types ), class_creator.creators ) - - decl_creators = [] - class_creators = filter( lambda creator: isinstance( creator, code_creators.class_t ) - , creators ) - - map( lambda creator: decl_creators.extend( self.associated_decl_creators( creator ) ) - , class_creators ) - - self.split_internal_creators( class_creator, creators, 'classes', decl_creators ) + self.split_internal_creators( class_creator, creators, 'classes' ) return 'classes' def split_internal_member_variables( self, class_creator ): Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-21 09:48:15 UTC (rev 569) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-21 09:51:06 UTC (rev 570) @@ -63,17 +63,23 @@ def associated_decl_creators( self, creator ): """ references to all class declaration code creators. """ - if not isinstance( creator, code_creators.class_t ): + if not isinstance( creator, code_creators.registration_based_t ): return [] - + associated_creators = creator.associated_decl_creators[:] - relevant_creators = filter( lambda acreator: isinstance( acreator, code_creators.class_t ) - , code_creators.make_flatten( creator.creators ) ) + internal_creators = [] + if isinstance( creator, code_creators.compound_t ): + internal_creators.extend( + filter( lambda acreator: isinstance( acreator, code_creators.compound_t ) + , code_creators.make_flatten( creator.creators ) ) ) - map( lambda acreator: associated_creators.extend( acreator.associated_decl_creators ) - , relevant_creators ) - + map( lambda internal_creator: associated_creators.extend( internal_creator.associated_decl_creators ) + , internal_creators ) + #now associated_creators contains all code creators associated with the creator + #We should leave only creators, defined in the global namespace + associated_creators = filter( lambda associated_creator: associated_creator.parent is self.extmodule + , associated_creators ) return associated_creators def create_function_code( self, function_name ): @@ -160,7 +166,7 @@ else: return os.linesep.join( map( lambda creator: creator.create(), ns_creators ) ) - def create_source( self, file_name, function_name, registration_creators, declaration_creators=None ): + def create_source( self, file_name, function_name, registration_creators ): """Return the content of a cpp file. @param file_name: The base name of the corresponding include file (without extension) @@ -172,9 +178,10 @@ @returns: The content for a cpp file @rtype: str """ + declaration_creators = [] + for rc in registration_creators: + declaration_creators.extend( self.associated_decl_creators( rc ) ) - if None is declaration_creators: - declaration_creators = [] creators = registration_creators + declaration_creators answer = [] @@ -211,19 +218,10 @@ self.write_file( header_name , self.create_header( class_creator.alias , self.create_function_code( function_name ) ) ) - class_wrapper = None - decl_creators = [] - if isinstance( class_creator, code_creators.class_t ): - decl_creators.extend( self.associated_decl_creators( class_creator ) ) - if class_creator.wrapper: - class_wrapper = class_creator.wrapper - decl_creators.append( class_creator.wrapper ) # Write the .cpp file... - cpp_code = self.create_source( class_creator.alias - , function_name - , [class_creator] - , decl_creators ) + cpp_code = self.create_source( class_creator.alias, function_name, [class_creator] ) + self.write_file( file_path + self.SOURCE_EXT, cpp_code ) # Replace the create() method so that only the register() method is called @@ -286,9 +284,8 @@ self.write_file( header_name , self.create_header( file_pattern, self.create_function_code( function_name ) ) ) self.write_file( file_path + self.SOURCE_EXT - , self.create_source( file_pattern - , function_name - , creators )) + , self.create_source( file_pattern, function_name, creators )) + for creator in creators: creator.create = lambda: '' self.extmodule.body.adopt_creator( Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-21 09:48:15 UTC (rev 569) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-21 09:51:06 UTC (rev 570) @@ -132,7 +132,7 @@ self.__free_operators = [] self.__exposed_free_fun_overloads = set() self.__exposed_opaque_decls = set() - + def _prepare_decls( self, decls, doc_extractor ): global DO_NOT_REPORT_MSGS @@ -534,7 +534,7 @@ if None is self.curr_decl.call_policies: self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) self.register_opaque_type( self.curr_decl.return_type, self.curr_decl.call_policies ) - + maker_cls, fwrapper_cls = creators_wizard.find_out_mem_fun_creator_classes( self.curr_decl ) maker = None @@ -569,8 +569,8 @@ self.__extmodule.add_system_header( code_repository.gil_state.file_name ) self.__extmodule.adopt_creator( code_creators.include_t( code_repository.gil_state.file_name ) , self.__extmodule.first_include_index() + 1) - + if self.curr_decl.has_static: #static_method should be created only once. found = filter( lambda creator: isinstance( creator, code_creators.static_method_t ) @@ -620,7 +620,7 @@ if None is self.curr_decl.call_policies: self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) self.register_opaque_type( self.curr_decl.return_type, self.curr_decl.call_policies ) - + self.__types_db.update( self.curr_decl ) if not self.curr_decl.parent.is_abstract \ and not declarations.is_reference( self.curr_decl.return_type ): @@ -710,6 +710,7 @@ wrapper = code_creators.class_wrapper_t( declaration=self.curr_decl , class_creator=cls_cc ) cls_cc.wrapper = wrapper + cls_cc.associated_decl_creators.append( wrapper ) #insert wrapper before module body if isinstance( self.curr_decl.parent, declarations.class_t ): #we deal with internal class This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |