Revision: 69
Author: roman_yakovenko
Date: 2006-05-14 00:20:29 -0700 (Sun, 14 May 2006)
ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=69&view=rev
Log Message:
-----------
From now, it is possible to get access to demangled
name of the function. It can help in some cases with
template functions
Modified Paths:
--------------
pygccxml_dev/pygccxml/declarations/calldef.py
Modified: pygccxml_dev/pygccxml/declarations/calldef.py
===================================================================
--- pygccxml_dev/pygccxml/declarations/calldef.py 2006-05-14 07:17:02 UTC (rev 68)
+++ pygccxml_dev/pygccxml/declarations/calldef.py 2006-05-14 07:20:29 UTC (rev 69)
@@ -21,6 +21,7 @@
import algorithm
import declaration
import type_traits
+import call_invocation
class VIRTUALITY_TYPES:
"""class that defines "virtuality" constants"""
@@ -42,7 +43,7 @@
self._name = name
self._default_value = default_value
self._type = type
-
+
def __str__(self):
if self.default_value==None:
return "%s %s"%(self.type, self.name)
@@ -108,7 +109,8 @@
self._exceptions = exceptions
self._return_type = return_type
self._has_extern = has_extern
-
+ self._demangled_name = None
+
def _get__cmp__call_items(self):
raise NotImplementedError()
@@ -180,7 +182,68 @@
doc="""Was this callable declared as "extern"?
@type: bool
""")
-
+
+ def __remove_parent_fname( self, demangled ):
+ demangled = demangled.strip()
+ parent_fname = algorithm.full_name( self.parent )
+ if parent_fname.startswith( '::' ) and not demangled.startswith( '::' ):
+ parent_fname = parent_fname[2:]
+ demangled = demangled[ len( parent_fname ): ]
+ return demangled
+
+ def _get_demangled_name( self ):
+ if not self.demangled:
+ self._demangled_name = ''
+
+ if self._demangled_name:
+ return self._demangled_name
+
+ if self._demangled_name == '':
+ return self.name
+
+ demangled = self.demangled
+ if self.return_type:
+ return_type = type_traits.remove_alias( self.return_type ).decl_string
+
+ if return_type.startswith( '::' ) and not self.demangled.startswith( '::' ):
+ return_type = return_type[2:]
+ demangled = self.demangled
+ if demangled.startswith( return_type ):
+ demangled = demangled[ len( return_type ): ]
+ demangled = demangled.strip()
+ #removing scope
+ demangled_name = call_invocation.name( self.__remove_parent_fname( demangled ) )
+ if demangled_name.startswith( '::' ):
+ demangled_name = demangled_name[2:]
+ #to be on the safe side
+ if demangled_name.startswith( self.name ):
+ self._demangled_name = demangled_name
+ return self._demangled_name
+
+ #well, I am going to try an other strategy
+ fname = algorithm.full_name( self )
+ found = self.demangled.find( fname )
+ if -1 == found:
+ if fname.startswith( '::' ):
+ fname = fname[2:]
+ found = self.demangled.find( fname )
+ if -1 == found:
+ self._demangled_name = ''
+ return self.name
+ demangled_name = call_invocation.name( self.demangled[ found: ] )
+ demangled_name = self.__remove_parent_fname( demangled_name )
+ if demangled_name.startswith( '::' ):
+ demangled_name = demangled_name[2:]
+ #to be on the safe side
+ if demangled_name.startswith( self.name ):
+ self._demangled_name = demangled_name
+ return self._demangled_name
+ #if -1 == found:
+ self._demangled_name = ''
+ return self.name
+
+ demangled_name = property( _get_demangled_name )
+
#Second level in hierarchy of calldef
class member_calldef_t( calldef_t ):
"""base class for "callable" declarations that defined within C++ class or struct"""
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|