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