Example #1
0
    def get_container_or_none(self, type):
        """returns reference to the class declaration or None"""
        type = type_traits.remove_alias(type)
        type = type_traits.remove_cv(type)

        cls = None
        if isinstance(type, cpptypes.declarated_t):
            cls = type_traits.remove_alias(type.declaration)
        elif isinstance(type, class_declaration.class_t):
            cls = type
        elif isinstance(type, class_declaration.class_declaration_t):
            cls = type
        else:
            return

        if not cls.name.startswith(self.name + '<'):
            return

        for ns in std_namespaces:
            if type_traits.impl_details.is_defined_in_xxx(ns, cls):
                return cls
Example #2
0
    def get_container_or_none( self, type ):
        """returns reference to the class declaration or None"""
        type = type_traits.remove_alias( type )
        type = type_traits.remove_cv( type )

        cls = None
        if isinstance( type, cpptypes.declarated_t ):
            cls = type_traits.remove_alias( type.declaration )
        elif isinstance( type, class_declaration.class_t ):
            cls = type
        elif isinstance( type, class_declaration.class_declaration_t ):
            cls = type
        else:
            return

        if not cls.name.startswith( self.name() + '<' ):
            return

        for ns in std_namespaces:
            if type_traits.impl_details.is_defined_in_xxx( ns, cls ):
                return cls
Example #3
0
    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
Example #4
0
    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
Example #5
0
 def _get_is_copy_constructor(self):
     args = self.arguments
     if 1 != len( args ):
         return False
     arg = args[0]
     if not type_traits.is_reference( arg.type ):
         return False
     if not type_traits.is_const( arg.type.base ):
         return False
     unaliased = type_traits.remove_alias( arg.type.base )
     #unaliased now refers to const_t instance
     if not isinstance( unaliased.base, cpptypes.declarated_t ):
         return False
     return id(unaliased.base.declaration) == id(self.parent)
Example #6
0
 def is_copy_constructor(self):
     """returns True if described declaration is copy constructor, otherwise False"""
     args = self.arguments
     if 1 != len( args ):
         return False
     arg = args[0]
     if not type_traits.is_reference( arg.type ):
         return False
     if not type_traits.is_const( arg.type.base ):
         return False
     unaliased = type_traits.remove_alias( arg.type.base )
     #unaliased now refers to const_t instance
     if not isinstance( unaliased.base, cpptypes.declarated_t ):
         return False
     return id(unaliased.base.declaration) == id(self.parent)
Example #7
0
 def is_copy_constructor(self):
     """returns True if described declaration is copy constructor, otherwise False"""
     args = self.arguments
     if 1 != len(args):
         return False
     arg = args[0]
     if not type_traits.is_reference(arg.type):
         return False
     if not type_traits.is_const(arg.type.base):
         return False
     unaliased = type_traits.remove_alias(arg.type.base)
     #unaliased now refers to const_t instance
     if not isinstance(unaliased.base, cpptypes.declarated_t):
         return False
     return id(unaliased.base.declaration) == id(self.parent)