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