[pygccxml-commit] SF.net SVN: pygccxml: [542] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-09-14 06:19:30
|
Revision: 542 http://svn.sourceforge.net/pygccxml/?rev=542&view=rev Author: roman_yakovenko Date: 2006-09-13 23:19:18 -0700 (Wed, 13 Sep 2006) Log Message: ----------- fixing small bugs in file_writers. Bug was related to nested class associated declarations Modified Paths: -------------- 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/unittests/algorithms_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-09-14 05:31:09 UTC (rev 541) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-09-14 06:19:18 UTC (rev 542) @@ -99,6 +99,18 @@ """ references to class declaration code creators. """ return self._associated_decl_creators + def recursive_associated_decl_creators( self ): + """ references to all class declaration code creators. """ + associated_creators = self.associated_decl_creators[:] + + relevant_creators = filter( lambda creator: isinstance( creator, class_t ) + , algorithm.make_flatten( self.creators ) ) + + map( lambda creator: associated_creators.extend( creator.associated_decl_creators ) + , relevant_creators ) + + return associated_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-14 05:31:09 UTC (rev 541) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-14 06:19:18 UTC (rev 542) @@ -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 ): + def split_internal_creators( self, class_creator, creators, pattern, decl_creators=None): file_path = os.path.join( self.directory_path , self.create_base_fname( class_creator, pattern ) ) @@ -104,6 +104,12 @@ source_code.append( '' ) source_code.append( self.create_namespaces_code( creators ) ) + if decl_creators: + for decl_creator in decl_creators: + source_code.append( '' ) + source_code.append( decl_creator.create() ) + decl_creator.create = lambda: '' + # Write the register() function... source_code.append( '' ) source_code.append( '%s{' % function_decl ) @@ -175,7 +181,14 @@ 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 ) - self.split_internal_creators( class_creator, creators, 'classes' ) + + decl_creators = [] + for creator in creators: + if not isinstance( creator, code_creators.class_t ): + continue + decl_creators.extend( creator.recursive_associated_decl_creators() ) + + self.split_internal_creators( class_creator, creators, 'classes', decl_creators ) 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-14 05:31:09 UTC (rev 541) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-14 06:19:18 UTC (rev 542) @@ -199,7 +199,7 @@ class_wrapper = None decl_creators = [] if isinstance( class_creator, code_creators.class_t ): - decl_creators.extend( class_creator.associated_decl_creators ) + decl_creators.extend( class_creator.recursive_associated_decl_creators() ) if class_creator.wrapper: class_wrapper = class_creator.wrapper decl_creators.append( class_creator.wrapper ) Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2006-09-14 05:31:09 UTC (rev 541) +++ pyplusplus_dev/unittests/algorithms_tester.py 2006-09-14 06:19:18 UTC (rev 542) @@ -121,22 +121,59 @@ minus_minus = xxx.operator( symbol='--' ) self.failUnless( 1 == len( minus_minus.readme() ), os.linesep.join( minus_minus.readme() ) ) +class multiple_files_tester_t(unittest.TestCase): + CLASS_DEF = \ + """ + namespace tester{ + struct b{ + enum EColor{ red, blue }; + enum EFruit{ apple, orange }; + + b(){} + b( int ){} + + void do_nothing(){} + + int do_somghing(){ return 1; } + + int m_dummy; + + struct b_nested{}; + }; + } + """ + def test(self): + mb = module_builder.module_builder_t( + [ module_builder.create_text_fc( self.CLASS_DEF ) ] + , gccxml_path=autoconfig.gccxml.executable ) + mb.namespace( name='::tester' ).include() + b = mb.class_( 'b' ) + b.add_declaration_code( '//hello world' ) + nested = b.class_( 'b_nested' ) + nested.add_declaration_code( '//hello nested decl' ) + nested.add_registration_code( '//hello nested reg', False ) + + mb.build_code_creator('b_multi') + mb.split_module( autoconfig.build_dir, on_unused_file_found=lambda fpath: fpath ) + class class_multiple_files_tester_t(unittest.TestCase): CLASS_DEF = \ """ namespace tester{ - struct X{ + struct x{ enum EColor{ red, blue }; enum EFruit{ apple, orange }; - X(){} - X( int ){} + x(){} + x( int ){} void do_nothing(){} int do_somghing(){ return 1; } int m_dummy; + + struct x_nested{}; }; } """ @@ -145,11 +182,16 @@ [ module_builder.create_text_fc( self.CLASS_DEF ) ] , gccxml_path=autoconfig.gccxml.executable ) mb.namespace( name='::tester' ).include() - X = mb.class_( 'X' ) - X.add_declaration_code( '//hello world' ) - mb.build_code_creator('dummy') + x = mb.class_( 'x' ) + x.add_registration_code( '//hello world reg' ) + x.add_declaration_code( '//hello world decl' ) + nested = x.class_( 'x_nested' ) + nested.add_declaration_code( '//hello nested decl' ) + nested.add_registration_code( '//hello nested reg', False ) + + mb.build_code_creator('x_class_multi') mb.split_module( autoconfig.build_dir - , [ mb.class_( '::tester::X' ) ] + , [ mb.class_( '::tester::x' ) ] , on_unused_file_found=lambda fpath: fpath ) @@ -169,6 +211,8 @@ def create_suite(): suite = unittest.TestSuite() + multiple_files_tester_t + suite.addTest( unittest.makeSuite(multiple_files_tester_t)) suite.addTest( unittest.makeSuite(doc_extractor_tester_t)) suite.addTest( unittest.makeSuite(class_organizer_tester_t)) suite.addTest( unittest.makeSuite(indent_tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |