mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Fixes #678: Support superclass declarations in C++ domain.
This commit is contained in:
1
CHANGES
1
CHANGES
@@ -46,6 +46,7 @@ Features added
|
||||
- Section headings in :rst:dir:`only` directives are now correctly
|
||||
handled.
|
||||
- Added ``emphasize-lines`` option to source code directives.
|
||||
- #678: C++ domain now supports superclasses.
|
||||
|
||||
* HTML builder:
|
||||
|
||||
|
@@ -488,8 +488,9 @@ class FuncDefExpr(NamedDefExpr):
|
||||
|
||||
class ClassDefExpr(NamedDefExpr):
|
||||
|
||||
def __init__(self, name, visibility, static):
|
||||
def __init__(self, name, visibility, static, bases):
|
||||
NamedDefExpr.__init__(self, name, visibility, static)
|
||||
self.bases = bases
|
||||
|
||||
def get_id(self):
|
||||
return self.name.get_id()
|
||||
@@ -497,6 +498,9 @@ class ClassDefExpr(NamedDefExpr):
|
||||
def __unicode__(self):
|
||||
buf = self.get_modifiers()
|
||||
buf.append(unicode(self.name))
|
||||
if self.bases:
|
||||
buf.append(u':')
|
||||
buf.append(u', '.join(unicode(base) for base in self.bases))
|
||||
return u' '.join(buf)
|
||||
|
||||
|
||||
@@ -879,7 +883,21 @@ class DefinitionParser(object):
|
||||
|
||||
def parse_class(self):
|
||||
visibility, static = self._parse_visibility_static()
|
||||
return ClassDefExpr(self._parse_type(), visibility, static)
|
||||
name = self._parse_type()
|
||||
bases = []
|
||||
if self.skip_string(':'):
|
||||
self.skip_ws()
|
||||
while 1:
|
||||
access = 'public'
|
||||
if self.match(_visibility_re):
|
||||
access = self.matched_text
|
||||
base = self._parse_type()
|
||||
bases.append(ClassDefExpr(base, access, False, []))
|
||||
if self.skip_string(','):
|
||||
self.skip_ws()
|
||||
else:
|
||||
break
|
||||
return ClassDefExpr(name, visibility, static, bases)
|
||||
|
||||
def read_rest(self):
|
||||
rv = self.definition[self.pos:]
|
||||
@@ -1005,6 +1023,13 @@ class CPPClassObject(CPPObject):
|
||||
self.attach_modifiers(signode, cls)
|
||||
signode += addnodes.desc_annotation('class ', 'class ')
|
||||
self.attach_name(signode, cls.name)
|
||||
if cls.bases:
|
||||
signode += nodes.Text(' : ')
|
||||
for base in cls.bases:
|
||||
self.attach_modifiers(signode, base)
|
||||
signode += nodes.emphasis(unicode(base.name), unicode(base.name))
|
||||
signode += nodes.Text(', ')
|
||||
signode.pop() # remove the trailing comma
|
||||
|
||||
|
||||
class CPPTypeObject(CPPObject):
|
||||
|
@@ -74,6 +74,26 @@ def test_type_definitions():
|
||||
assert unicode(parse('member_object', x)) == x
|
||||
|
||||
|
||||
def test_bases():
|
||||
x = 'A'
|
||||
assert unicode(parse('class', x)) == x
|
||||
|
||||
x = 'A : B'
|
||||
assert unicode(parse('class', x)) == x
|
||||
|
||||
x = 'A : private B'
|
||||
assert unicode(parse('class', x)) == x
|
||||
|
||||
x = 'A : public B'
|
||||
assert unicode(parse('class', x)) == 'A : B'
|
||||
|
||||
x = 'A : B, C'
|
||||
assert unicode(parse('class', x)) == x
|
||||
|
||||
x = 'A : B, protected C, D'
|
||||
assert unicode(parse('class', x)) == x
|
||||
|
||||
|
||||
def test_operators():
|
||||
x = parse('function', 'void operator new [ ] ()')
|
||||
assert unicode(x) == 'void operator new[]()'
|
||||
|
Reference in New Issue
Block a user