[pygccxml-commit] SF.net SVN: pygccxml: [856] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2007-01-07 12:51:08
|
Revision: 856 http://svn.sourceforge.net/pygccxml/?rev=856&view=rev Author: roman_yakovenko Date: 2007-01-07 04:51:09 -0800 (Sun, 07 Jan 2007) Log Message: ----------- adding new feature - aliases test. Modified Paths: -------------- pyplusplus_dev/pyplusplus/messages/warnings_.py pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/data/duplicate_aliases_to_be_exported.cpp pyplusplus_dev/unittests/data/duplicate_aliases_to_be_exported.hpp pyplusplus_dev/unittests/duplicate_aliases_tester.py Modified: pyplusplus_dev/pyplusplus/messages/warnings_.py =================================================================== --- pyplusplus_dev/pyplusplus/messages/warnings_.py 2007-01-07 07:28:43 UTC (rev 855) +++ pyplusplus_dev/pyplusplus/messages/warnings_.py 2007-01-07 12:51:09 UTC (rev 856) @@ -137,6 +137,11 @@ 'The function wrapper can throw any exception. ' \ 'In case of exception in run-time, the behaviour of the program is undefined! ' +W1047 = 'There are two or more classes that use same alias("%s"). ' \ + 'Duplicated aliases causes few problems, but the main one is that some ' \ + 'of the classes will not be exposed to Python.' \ + 'Other classes : %s' + warnings = globals() for identifier, explanation in warnings.items(): Modified: pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py 2007-01-07 07:28:43 UTC (rev 855) +++ pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py 2007-01-07 12:51:09 UTC (rev 856) @@ -19,6 +19,41 @@ def add_exported( self, decl ): self.__exported_decls.append( decl ) + def __select_duplicate_aliases( self, decls ): + duplicated = {} + for decl in decls: + if not duplicated.has_key( decl.alias ): + duplicated[ decl.alias ] = set() + duplicated[ decl.alias ].add( decl ) + for alias, buggy_decls in duplicated.items(): + if 1 == len( buggy_decls ): + del duplicated[ alias ] + return duplicated + + def __report_duplicate_aliases_impl( self, control_decl, duplicated ): + if control_decl.alias in duplicated: + buggy_decls = duplicated[control_decl.alias].copy() + buggy_decls.remove( control_decl ) + warning = messages.W1047 % ( control_decl.alias + , os.linesep.join( map( str, buggy_decls ) ) ) + self.__logger.warn( "%s;%s" % ( control_decl, warning ) ) + + if isinstance( control_decl, declarations.class_t ): + query = lambda i_decl: isinstance( i_decl, declarations.class_types ) \ + and i_decl.ignore == False + i_decls = control_decl.classes( query, recursive=False, allow_empty=True ) + i_duplicated = self.__select_duplicate_aliases( i_decls ) + for i_decl in i_decls: + self.__report_duplicate_aliases_impl( i_decl, i_duplicated ) + + def __report_duplicate_aliases( self ): + decls = filter( lambda decl: isinstance( decl, declarations.class_types ) \ + and isinstance( decl.parent, declarations.namespace_t ) + , self.__exported_decls ) + duplicated = self.__select_duplicate_aliases( decls ) + for decl in decls: + self.__report_duplicate_aliases_impl( decl, duplicated ) + def __is_std_decl( self, decl ): #Every class under std should be exported by Boost.Python and\\or Py++ #Also this is not the case right now, I prefer to hide the warnings @@ -34,6 +69,7 @@ def __build_dependencies( self, decl ): if self.__is_std_decl( decl ): + #TODO add element_type to the list of dependencies return [] #std declarations should be exported by Py++! dependencies = decl.i_depend_on_them(recursive=False) @@ -69,7 +105,7 @@ groups[ id( depend_on_decl ) ].append( dependency ) return groups - def __create_msg( self, dependencies ): + def __create_dependencies_msg( self, dependencies ): depend_on_decl = dependencies[0].find_out_depend_on_declaration() decls = [] for dependency in dependencies: @@ -80,4 +116,5 @@ used_not_exported_decls = self.__find_out_used_but_not_exported() groups = self.__group_by_unexposed( used_not_exported_decls ) for group in groups.itervalues(): - self.__logger.warn( self.__create_msg( group ) ) + self.__logger.warn( self.__create_dependencies_msg( group ) ) + self.__report_duplicate_aliases() Added: pyplusplus_dev/unittests/data/duplicate_aliases_to_be_exported.cpp =================================================================== --- pyplusplus_dev/unittests/data/duplicate_aliases_to_be_exported.cpp (rev 0) +++ pyplusplus_dev/unittests/data/duplicate_aliases_to_be_exported.cpp 2007-01-07 12:51:09 UTC (rev 856) @@ -0,0 +1,13 @@ +// Copyright 2004 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#include "duplicate_aliases_to_be_exported.hpp" + +namespace duplicate_aliases{ + + +}//duplicate_aliases + + Added: pyplusplus_dev/unittests/data/duplicate_aliases_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/duplicate_aliases_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/duplicate_aliases_to_be_exported.hpp 2007-01-07 12:51:09 UTC (rev 856) @@ -0,0 +1,22 @@ +// Copyright 2004 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef __duplicate_aliases_to_be_exported_hpp__ +#define __duplicate_aliases_to_be_exported_hpp__ + +namespace duplicate_aliases{ + +struct duplicate_aliases_1{}; +struct duplicate_aliases_2{}; +struct duplicate_aliases_3{ + + struct i_duplicate_aliases_4{}; + struct i_duplicate_aliases_5{}; + +}; + +} + +#endif//__duplicate_aliases_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/duplicate_aliases_tester.py =================================================================== --- pyplusplus_dev/unittests/duplicate_aliases_tester.py (rev 0) +++ pyplusplus_dev/unittests/duplicate_aliases_tester.py 2007-01-07 12:51:09 UTC (rev 856) @@ -0,0 +1,38 @@ +# Copyright 2004 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import os +import sys +import unittest +import fundamental_tester_base +from pyplusplus import code_creators + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'duplicate_aliases' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize(self, mb): + classes = mb.classes( lambda decl: 'duplicate_aliases' in decl.name ) + classes.alias = 'duplicate_aliases' + + def run_tests( self, module): + #check compilation + pass + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2007-01-07 07:28:43 UTC (rev 855) +++ pyplusplus_dev/unittests/test_all.py 2007-01-07 12:51:09 UTC (rev 856) @@ -69,6 +69,7 @@ import declarations_order_bug_tester import function_transformations_tester import throw_tester +import duplicate_aliases_tester def create_suite(times): testers = [ @@ -134,6 +135,7 @@ , declarations_order_bug_tester , function_transformations_tester , throw_tester + , duplicate_aliases_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |