Added basic modifier support

This commit is contained in:
Armin Ronacher
2010-03-01 19:54:11 +01:00
parent 9da129aeb9
commit 27667cc0b7

View File

@@ -29,6 +29,7 @@ _identifier_re = re.compile(r'\b(~?[a-zA-Z_][a-zA-Z0-9_]*)\b')
_whitespace_re = re.compile(r'\s+(?u)') _whitespace_re = re.compile(r'\s+(?u)')
_string_re = re.compile(r"[LuU8]?('([^'\\]*(?:\\.[^'\\]*)*)'" _string_re = re.compile(r"[LuU8]?('([^'\\]*(?:\\.[^'\\]*)*)'"
r'|"([^"\\]*(?:\\.[^"\\]*)*)")', re.S) r'|"([^"\\]*(?:\\.[^"\\]*)*)")', re.S)
_visibility_re = re.compile(r'\b(public|private|protected)\b')
_operator_re = re.compile(r'''(?x) _operator_re = re.compile(r'''(?x)
\[\s*\] \[\s*\]
| \(\s*\) | \(\s*\)
@@ -268,14 +269,24 @@ class PrefixedNameDefExpr(DefExpr):
class NamedDefExpr(DefExpr): class NamedDefExpr(DefExpr):
def __init__(self, name): def __init__(self, name, visibility, static):
self.name = name self.name = name
self.visibility = visibility
self.static = static
def get_modifiers(self):
rv = []
if self.visibility != 'public':
rv.append(self.visibility)
if self.static:
rv.append(u'static')
return rv
class TypeObjDefExpr(NamedDefExpr): class TypeObjDefExpr(NamedDefExpr):
def __init__(self, typename, name): def __init__(self, name, visibility, static, typename):
NamedDefExpr.__init__(self, name) NamedDefExpr.__init__(self, name, visibility, static)
self.typename = typename self.typename = typename
def get_id(self): def get_id(self):
@@ -284,15 +295,18 @@ class TypeObjDefExpr(NamedDefExpr):
return u'%s__%s' % (self.name.get_id(), self.typename.get_id()) return u'%s__%s' % (self.name.get_id(), self.typename.get_id())
def __unicode__(self): def __unicode__(self):
buf = self.get_modifiers()
if self.typename is None: if self.typename is None:
return unicode(self.name) buf.append(unicode(self.name))
return u'%s %s' % (self.typename, self.name) else:
buf.extend(map(unicode, (self.typename, self.name)))
return u' '.join(buf)
class MemberObjDefExpr(NamedDefExpr): class MemberObjDefExpr(NamedDefExpr):
def __init__(self, typename, name, value): def __init__(self, name, visibility, static, typename, value):
NamedDefExpr.__init__(self, name) NamedDefExpr.__init__(self, name, visibility, static)
self.typename = typename self.typename = typename
self.value = value self.value = value
@@ -300,16 +314,18 @@ class MemberObjDefExpr(NamedDefExpr):
return u'%s__%s' % (self.name.get_id(), self.typename.get_id()) return u'%s__%s' % (self.name.get_id(), self.typename.get_id())
def __unicode__(self): def __unicode__(self):
rv = u'%s %s' % (self.typename, self.name) buf = self.get_modifiers()
buf.append(u'%s %s' % (self.typename, self.name))
if self.value is not None: if self.value is not None:
rv = u'%s = %s' % (rv, self.value) buf.append(u'%s = %s' % (rv, self.value))
return rv return u' '.join(buf)
class FuncDefExpr(NamedDefExpr): class FuncDefExpr(NamedDefExpr):
def __init__(self, name, rv, signature, const, pure_virtual): def __init__(self, name, visibility, static, rv, signature,
NamedDefExpr.__init__(self, name) const, pure_virtual):
NamedDefExpr.__init__(self, name, visibility, static)
self.rv = rv self.rv = rv
self.signature = signature self.signature = signature
self.const = const self.const = const
@@ -324,25 +340,30 @@ class FuncDefExpr(NamedDefExpr):
) )
def __unicode__(self): def __unicode__(self):
return u'%s%s(%s)%s%s' % ( buf = self.get_modifiers()
self.rv is not None and unicode(self.rv) + u' ' or u'', if self.rv is not None:
self.name, buf.append(unicode(self.rv))
u', '.join(map(unicode, self.signature)), buf.append(u'%s(%s)' % (self.name, u', '.join(
self.const and u' const' or u'', map(unicode, self.signature))))
self.pure_virtual and ' = 0' or '' if self.const:
) buf.append(u'const')
if self.pure_virtual:
buf.append(u'= 0')
return u' '.join(buf)
class ClassDefExpr(NamedDefExpr): class ClassDefExpr(NamedDefExpr):
def __init__(self, name): def __init__(self, name, visibility, static):
NamedDefExpr.__init__(self, name) NamedDefExpr.__init__(self, name, visibility, static)
def get_id(self): def get_id(self):
return self.name.get_id() return self.name.get_id()
def __unicode__(self): def __unicode__(self):
return unicode(self.name) buf = self.get_modifiers()
buf.append(unicode(self.name))
return u' '.join(buf)
class DefinitionParser(object): class DefinitionParser(object):
@@ -514,6 +535,7 @@ class DefinitionParser(object):
return TemplateDefExpr(typename, args) return TemplateDefExpr(typename, args)
def _parse_type(self, in_template=False): def _parse_type(self, in_template=False):
self.skip_ws()
result = [] result = []
modifiers = [] modifiers = []
@@ -623,10 +645,18 @@ class DefinitionParser(object):
pure_virtual = False pure_virtual = False
return args, const, pure_virtual return args, const, pure_virtual
def _parse_visibility_static(self):
visibility = 'public'
if self.match(_visibility_re):
visibility = self.matched_text
static = self.skip_word('static')
return visibility, static
def parse_type(self): def parse_type(self):
return self._parse_type() return self._parse_type()
def parse_type_object(self): def parse_type_object(self):
visibility, static = self._parse_visibility_static()
typename = self._parse_type() typename = self._parse_type()
self.skip_ws() self.skip_ws()
if not self.eof: if not self.eof:
@@ -634,9 +664,10 @@ class DefinitionParser(object):
else: else:
name = typename name = typename
typename = None typename = None
return TypeObjDefExpr(typename, name) return TypeObjDefExpr(name, visibility, static, typename)
def parse_member_object(self): def parse_member_object(self):
visibility, static = self._parse_visibility_static()
typename = self._parse_type() typename = self._parse_type()
name = self._parse_type() name = self._parse_type()
self.skip_ws() self.skip_ws()
@@ -644,9 +675,10 @@ class DefinitionParser(object):
value = self.read_rest().strip() value = self.read_rest().strip()
else: else:
value = None value = None
return MemberObjDefExpr(typename, name, value) return MemberObjDefExpr(name, visibility, static, typename, value)
def parse_function(self): def parse_function(self):
visibility, static = self._parse_visibility_static()
rv = self._parse_type() rv = self._parse_type()
self.skip_ws() self.skip_ws()
# some things just don't have return values # some things just don't have return values
@@ -655,10 +687,12 @@ class DefinitionParser(object):
rv = None rv = None
else: else:
name = self._parse_type() name = self._parse_type()
return FuncDefExpr(name, rv, *self._parse_signature()) return FuncDefExpr(name, visibility, static, rv,
*self._parse_signature())
def parse_class(self): def parse_class(self):
return ClassDefExpr(self._parse_type()) visibility, static = self._parse_visibility_static()
return ClassDefExpr(self._parse_type(), visibility, static)
def read_rest(self): def read_rest(self):
rv = self.definition[self.pos:] rv = self.definition[self.pos:]
@@ -692,6 +726,15 @@ class CPPObject(ObjectDescription):
pnode += nodes.Text(text) pnode += nodes.Text(text)
node += pnode node += pnode
def attach_modifiers(self, node, obj):
if obj.visibility != 'public':
node += addnodes.desc_annotation(obj.visibility,
obj.visibility)
node += nodes.Text(' ')
if obj.static:
node += addnodes.desc_annotation('static', 'static')
node += nodes.Text(' ')
def add_target_and_index(self, sigobj, sig, signode): def add_target_and_index(self, sigobj, sig, signode):
theid = sigobj.get_id() theid = sigobj.get_id()
name = unicode(sigobj.name) name = unicode(sigobj.name)
@@ -752,6 +795,7 @@ class CPPClassObject(CPPObject):
return parser.parse_class() return parser.parse_class()
def describe_signature(self, signode, cls): def describe_signature(self, signode, cls):
self.attach_modifiers(signode, cls)
signode += addnodes.desc_annotation('class ', 'class ') signode += addnodes.desc_annotation('class ', 'class ')
self.attach_name(signode, cls.name) self.attach_name(signode, cls.name)
@@ -767,6 +811,7 @@ class CPPTypeObject(CPPObject):
return parser.parse_type_object() return parser.parse_type_object()
def describe_signature(self, signode, obj): def describe_signature(self, signode, obj):
self.attach_modifiers(signode, obj)
signode += addnodes.desc_annotation('type ', 'type ') signode += addnodes.desc_annotation('type ', 'type ')
if obj.typename is not None: if obj.typename is not None:
self.attach_type(signode, obj.typename) self.attach_type(signode, obj.typename)
@@ -785,6 +830,7 @@ class CPPMemberObject(CPPObject):
return parser.parse_member_object() return parser.parse_member_object()
def describe_signature(self, signode, obj): def describe_signature(self, signode, obj):
self.attach_modifiers(signode, obj)
self.attach_type(signode, obj.typename) self.attach_type(signode, obj.typename)
signode += nodes.Text(' ') signode += nodes.Text(' ')
self.attach_name(signode, obj.name) self.attach_name(signode, obj.name)
@@ -835,6 +881,7 @@ class CPPFunctionObject(CPPObject):
return parser.parse_function() return parser.parse_function()
def describe_signature(self, signode, func): def describe_signature(self, signode, func):
self.attach_modifiers(signode, func)
# return value is None for things with a reverse return value # return value is None for things with a reverse return value
# such as casting operator definitions or constructors # such as casting operator definitions or constructors
# and destructors. # and destructors.