[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.
|