Skip to content

Commit 7d836e1

Browse files
committed
C++, add support for virtual base classes
1 parent 8401d67 commit 7d836e1

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

CHANGES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ Bugs fixed
6666
transforming.
6767
* C++, fix parsing of 'signed char' and 'unsigned char' as types.
6868
* C++, add missing support for 'friend' functions.
69+
* C++, add support for virtual bases.
6970

7071
Documentation
7172
-------------

sphinx/domains/cpp.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1845,15 +1845,18 @@ def describe_signature(self, signode, mode, env, symbol):
18451845

18461846

18471847
class ASTBaseClass(ASTBase):
1848-
def __init__(self, name, visibility):
1848+
def __init__(self, name, visibility, virtual):
18491849
self.name = name
18501850
self.visibility = visibility
1851+
self.virtual = virtual
18511852

18521853
def __unicode__(self):
18531854
res = []
18541855
if self.visibility != 'private':
18551856
res.append(self.visibility)
18561857
res.append(' ')
1858+
if self.virtual:
1859+
res.append('virtual ')
18571860
res.append(text_type(self.name))
18581861
return u''.join(res)
18591862

@@ -1863,6 +1866,9 @@ def describe_signature(self, signode, mode, env, symbol):
18631866
signode += addnodes.desc_annotation(self.visibility,
18641867
self.visibility)
18651868
signode += nodes.Text(' ')
1869+
if self.virtual:
1870+
signode += addnodes.desc_annotation('virtual', 'virtual')
1871+
signode += nodes.Text(' ')
18661872
self.name.describe_signature(signode, 'markType', env, symbol=symbol)
18671873

18681874

@@ -3005,11 +3011,20 @@ def _parse_class(self):
30053011
if self.skip_string(':'):
30063012
while 1:
30073013
self.skip_ws()
3014+
virtual = False
3015+
if self.skip_string('virtual'):
3016+
virtual = True
3017+
self.skip_ws()
30083018
visibility = 'private'
30093019
if self.match(_visibility_re):
30103020
visibility = self.matched_text
3021+
self.skip_ws()
3022+
if self.skip_string('virtual'):
3023+
if virtual == True:
3024+
self.fail('Duplicate virtual keyword found')
3025+
virtual = True
30113026
baseName = self._parse_nested_name()
3012-
bases.append(ASTBaseClass(baseName, visibility))
3027+
bases.append(ASTBaseClass(baseName, visibility, virtual))
30133028
self.skip_ws()
30143029
if self.skip_string(','):
30153030
continue

tests/test_domain_cpp.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,9 @@ def test_bases():
304304
check('class', 'A : public B', "A", "1A")
305305
check('class', 'A : B, C', "A", "1A")
306306
check('class', 'A : B, protected C, D', "A", "1A")
307+
check('class', 'A : virtual private B', 'A', '1A', output='A : virtual B')
308+
check('class', 'A : B, virtual C', 'A', '1A')
309+
check('class', 'A : public virtual B', 'A', '1A')
307310

308311

309312
def test_operators():

0 commit comments

Comments
 (0)