[pygccxml-commit] SF.net SVN: pygccxml:[1780]
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2009-12-15 20:44:57
|
Revision: 1780 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1780&view=rev Author: roman_yakovenko Date: 2009-12-15 20:44:50 +0000 (Tue, 15 Dec 2009) Log Message: ----------- fix for "get dependencies" functionality Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/dependencies.py pyplusplus_dev/pyplusplus/creators_factory/dependencies_manager.py Modified: pygccxml_dev/pygccxml/declarations/dependencies.py =================================================================== --- pygccxml_dev/pygccxml/declarations/dependencies.py 2009-11-16 21:15:20 UTC (rev 1779) +++ pygccxml_dev/pygccxml/declarations/dependencies.py 2009-12-15 20:44:50 UTC (rev 1780) @@ -9,6 +9,28 @@ import cpptypes +class impl_details: + @staticmethod + def dig_declarations( depend_on_it ): + #prevent recursive import + from pygccxml import declarations + + if isinstance( depend_on_it, declarations.declaration_t ): + return [depend_on_it] + base_type = declarations.base_type( declarations.remove_alias( depend_on_it ) ) + if isinstance( base_type, cpptypes.declarated_t ): + return [base_type.declaration] + elif isinstance( base_type, cpptypes.calldef_type_t ): + result = [] + result.extend( impl_details.dig_declarations( base_type.return_type ) ) + for argtype in base_type.arguments_types: + result.extend( impl_details.dig_declarations( argtype ) ) + if isinstance( base_type, cpptypes.member_function_type_t ): + result.extend( impl_details.dig_declarations( base_type.class_inst ) ) + return result + return [] + + class dependency_info_t( object ): def __init__( self, declaration, depend_on_it, access_type=None, hint=None ): object.__init__( self ) @@ -46,20 +68,12 @@ about dependency. It can be used later""" return self._hint - def find_out_depend_on_declaration( self ): + def find_out_depend_on_it_declarations( self ): """if declaration depends on other declaration and not on some type this function will return reference to it. Otherwise None will be returned """ - #prevent recursive import - from pygccxml import declarations + return impl_details.dig_declarations( self.depend_on_it ) - if isinstance( self.depend_on_it, declarations.declaration_t ): - return self.depend_on_it - base_type = declarations.base_type( declarations.remove_alias( self.depend_on_it ) ) - if isinstance( base_type, cpptypes.declarated_t ): - return base_type.declaration - return None - @staticmethod def i_depend_on_them( decl ): """returns set of declarations. every item in the returned set, depends on a @@ -67,9 +81,9 @@ import class_declaration #prevent cyclic imports to_be_included = set() for dependency_info in decl.i_depend_on_them(): - ddecl = dependency_info.find_out_depend_on_declaration() - if ddecl: - to_be_included.add( ddecl ) + for ddecl in dependency_info.find_out_depend_on_it_declarations(): + if ddecl: + to_be_included.add( ddecl ) if isinstance( decl.parent, class_declaration.class_t ): to_be_included.add( decl.parent ) Modified: pyplusplus_dev/pyplusplus/creators_factory/dependencies_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/dependencies_manager.py 2009-11-16 21:15:20 UTC (rev 1779) +++ pyplusplus_dev/pyplusplus/creators_factory/dependencies_manager.py 2009-12-15 20:44:50 UTC (rev 1780) @@ -141,28 +141,30 @@ exported_ids = set( map( lambda d: id( d ), self.__exported_decls ) ) for decl in self.__exported_decls: for dependency in self.__build_dependencies( decl ): - depend_on_decl = dependency.find_out_depend_on_declaration() - if self.__has_unexposed_dependency( exported_ids, depend_on_decl, dependency ): - if messages.filter_disabled_msgs([messages.W1040], depend_on_decl.disabled_messages ): - #need to report dependency errors - used_not_exported.append(dependency) + for depend_on_decl in dependency.find_out_depend_on_it_declarations(): + if self.__has_unexposed_dependency( exported_ids, depend_on_decl, dependency ): + if messages.filter_disabled_msgs([messages.W1040], depend_on_decl.disabled_messages ): + #need to report dependency errors + used_not_exported.append(dependency) return used_not_exported def __group_by_unexposed( self, dependencies ): groups = {} for dependency in dependencies: - depend_on_decl = dependency.find_out_depend_on_declaration() - if not groups.has_key( id( depend_on_decl ) ): - groups[ id( depend_on_decl ) ] = [] - groups[ id( depend_on_decl ) ].append( dependency ) + for depend_on_decl in dependency.find_out_depend_on_it_declarations(): + if not groups.has_key( id( depend_on_decl ) ): + groups[ id( depend_on_decl ) ] = [] + groups[ id( depend_on_decl ) ].append( dependency ) return groups def __create_dependencies_msg( self, dependencies ): - depend_on_decl = dependencies[0].find_out_depend_on_declaration() - decls = [] - for dependency in dependencies: - decls.append( os.linesep + ' ' + str( dependency.declaration ) ) - return "%s;%s" % ( depend_on_decl, messages.W1040 % ''.join( decls ) ) + msg = [] + for depend_on_decl in dependencies[0].find_out_depend_on_it_declarations(): + decls = [] + for dependency in dependencies: + decls.append( os.linesep + ' ' + str( dependency.declaration ) ) + msg.append( "%s;%s" % ( depend_on_decl, messages.W1040 % ''.join( decls ) ) ) + return os.linesep.join( msg ) def __report_duplicated_aliases( self ): decls = filter( lambda decl: isinstance( decl, declarations.class_types ) \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |