declarations.py

来自「Boost provides free peer-reviewed portab」· Python 代码 · 共 654 行 · 第 1/2 页

PY
654
字号
# Copyright Bruno da Silva de Oliveira 2003. Use, modification and # distribution is subject to 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)'''Defines classes that represent declarations found in C++ header files.    '''# version indicates the version of the declarations. Whenever a declaration# changes, this variable should be updated, so that the caches can be rebuilt# automaticallyversion = '1.0'#==============================================================================# Declaration#==============================================================================class Declaration(object):    '''Base class for all declarations.    @ivar name: The name of the declaration.    @ivar namespace: The namespace of the declaration.    '''    def __init__(self, name, namespace):        '''        @type name: string        @param name: The name of this declaration        @type namespace: string        @param namespace: the full namespace where this declaration resides.        '''        self.name = name        self.namespace = namespace        self.location = '', -1  # (filename, line)        self.incomplete = False        self.is_unique = True    def FullName(self):        '''        Returns the full qualified name: "boost::inner::Test"        @rtype: string        @return: The full name of the declaration.        '''        namespace = self.namespace or ''        if namespace and not namespace.endswith('::'):            namespace += '::'        return namespace + self.name            def __repr__(self):                return '<Declaration %s at %s>' % (self.FullName(), id(self))    def __str__(self):        return 'Declaration of %s' % self.FullName()        #==============================================================================# Class#==============================================================================class Class(Declaration):    '''    Represents a C++ class or struct. Iteration through it yields its members.    @type abstract: bool    @ivar abstract: if the class has any abstract methods.    @type bases: tuple    @ivar bases: tuple with L{Base} instances, representing the most direct    inheritance.    @type hierarchy: list    @ivar hierarchy: a list of tuples of L{Base} instances, representing    the entire hierarchy tree of this object. The first tuple is the parent     classes, and the other ones go up in the hierarchy.    '''    def __init__(self, name, namespace, members, abstract):        Declaration.__init__(self, name, namespace)        self.__members = members        self.__member_names = {}        self.abstract = abstract        self.bases = ()        self.hierarchy = ()        self.operator = {}    def __iter__(self):        '''iterates through the class' members.        '''        return iter(self.__members)                def Constructors(self, publics_only=True):        '''Returns a list of the constructors for this class.        @rtype: list        '''        constructors = []        for member in self:            if isinstance(member, Constructor):                if publics_only and member.visibility != Scope.public:                    continue                constructors.append(member)        return constructors        def HasCopyConstructor(self):        '''Returns true if this class has a public copy constructor.        @rtype: bool        '''        for cons in self.Constructors():            if cons.IsCopy():                return True        return False    def HasDefaultConstructor(self):        '''Returns true if this class has a public default constructor.        @rtype: bool        '''        for cons in self.Constructors():            if cons.IsDefault():                return True        return False    def AddMember(self, member):        if member.name in self.__member_names:            member.is_unique = False            for m in self:                if m.name == member.name:                    m.is_unique = False        else:            member.is_unique = True        self.__member_names[member.name] = 1        self.__members.append(member)        if isinstance(member, ClassOperator):            self.operator[member.name] = member    def ValidMemberTypes():        return (NestedClass, Method, Constructor, Destructor, ClassVariable,                 ClassOperator, ConverterOperator, ClassEnumeration)       ValidMemberTypes = staticmethod(ValidMemberTypes)                          #==============================================================================# NestedClass#==============================================================================class NestedClass(Class):    '''The declaration of a class/struct inside another class/struct.        @type class: string    @ivar class: fullname of the class where this class is contained.    @type visibility: L{Scope}     @ivar visibility: the visibility of this class.    '''    def __init__(self, name, class_, visib, members, abstract):        Class.__init__(self, name, None, members, abstract)        self.class_ = class_        self.visibility = visib    def FullName(self):        '''The full name of this class, like ns::outer::inner.        @rtype: string        '''        return '%s::%s' % (self.class_, self.name)    #==============================================================================# Scope    #==============================================================================class Scope:        '''Used to represent the visibility of various members inside a class.    @cvar public: public visibility    @cvar private: private visibility    @cvar protected: protected visibility    '''    public = 'public'    private = 'private'    protected = 'protected'     #==============================================================================# Base    #==============================================================================class Base:    '''Represents a base class of another class.    @ivar _name: the full name of the base class.    @ivar _visibility: the visibility of the derivation.    '''    def __init__(self, name, visibility=Scope.public):        self.name = name        self.visibility = visibility    #==============================================================================# Function    #==============================================================================class Function(Declaration):    '''The declaration of a function.    @ivar _result: instance of L{Type} or None.    @ivar _parameters: list of L{Type} instances.    @ivar _throws: exception specifiers or None     '''    def __init__(self, name, namespace, result, params, throws=None):         Declaration.__init__(self, name, namespace)        # the result type: instance of Type, or None (constructors)                    self.result = result        # the parameters: instances of Type        self.parameters = params        # the exception specification        self.throws     = throws     def Exceptions(self):        if self.throws is None:            return ""        else:            return " throw(%s)" % ', '.join ([x.FullName() for x in self.throws])     def PointerDeclaration(self, force=False):        '''Returns a declaration of a pointer to this function.        @param force: If True, returns a complete pointer declaration regardless        if this function is unique or not.        '''        if self.is_unique and not force:            return '&%s' % self.FullName()        else:            result = self.result.FullName()            params = ', '.join([x.FullName() for x in self.parameters])             return '(%s (*)(%s)%s)&%s' % (result, params, self.Exceptions(), self.FullName())        def MinArgs(self):        min = 0        for arg in self.parameters:            if arg.default is None:                min += 1        return min    minArgs = property(MinArgs)        def MaxArgs(self):        return len(self.parameters)    maxArgs = property(MaxArgs)        #==============================================================================# Operator#==============================================================================class Operator(Function):    '''The declaration of a custom operator. Its name is the same as the     operator name in C++, ie, the name of the declaration "operator+(..)" is    "+".    '''        def FullName(self):        namespace = self.namespace or ''        if not namespace.endswith('::'):            namespace += '::'        return namespace + 'operator' + self.name #==============================================================================# Method#==============================================================================class Method(Function):    '''The declaration of a method.        @ivar _visibility: the visibility of this method.    @ivar _virtual: if this method is declared as virtual.    @ivar _abstract: if this method is virtual but has no default implementation.    @ivar _static: if this method is static.    @ivar _class: the full name of the class where this method was declared.    @ivar _const: if this method is declared as const.    @ivar _throws: list of exception specificiers or None    '''    def __init__(self, name, class_, result, params, visib, virtual, abstract, static, const, throws=None):         Function.__init__(self, name, None, result, params, throws)        self.visibility = visib        self.virtual = virtual        self.abstract = abstract        self.static = static        self.class_ = class_        self.const = const        def FullName(self):        return self.class_ + '::' + self.name    def PointerDeclaration(self, force=False):        '''Returns a declaration of a pointer to this member function.        @param force: If True, returns a complete pointer declaration regardless        if this function is unique or not.         '''        if self.static:            # static methods are like normal functions            return Function.PointerDeclaration(self, force)        if self.is_unique and not force:            return '&%s' % self.FullName()        else:            result = self.result.FullName()            params = ', '.join([x.FullName() for x in self.parameters])             const = ''            if self.const:                const = 'const'                        return '(%s (%s::*)(%s) %s%s)&%s' %\                (result, self.class_, params, const, self.Exceptions(), self.FullName())  #==============================================================================# Constructor#==============================================================================class Constructor(Method):

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?