C++, add support for virtual base classes

This commit is contained in:
Rapptz 2015-10-01 02:17:33 -04:00
parent 8401d67909
commit 7d836e16ab
3 changed files with 21 additions and 2 deletions

View File

@ -66,6 +66,7 @@ Bugs fixed
transforming. transforming.
* C++, fix parsing of 'signed char' and 'unsigned char' as types. * C++, fix parsing of 'signed char' and 'unsigned char' as types.
* C++, add missing support for 'friend' functions. * C++, add missing support for 'friend' functions.
* C++, add support for virtual bases.
Documentation Documentation
------------- -------------

View File

@ -1845,15 +1845,18 @@ class ASTTypeUsing(ASTBase):
class ASTBaseClass(ASTBase): class ASTBaseClass(ASTBase):
def __init__(self, name, visibility): def __init__(self, name, visibility, virtual):
self.name = name self.name = name
self.visibility = visibility self.visibility = visibility
self.virtual = virtual
def __unicode__(self): def __unicode__(self):
res = [] res = []
if self.visibility != 'private': if self.visibility != 'private':
res.append(self.visibility) res.append(self.visibility)
res.append(' ') res.append(' ')
if self.virtual:
res.append('virtual ')
res.append(text_type(self.name)) res.append(text_type(self.name))
return u''.join(res) return u''.join(res)
@ -1863,6 +1866,9 @@ class ASTBaseClass(ASTBase):
signode += addnodes.desc_annotation(self.visibility, signode += addnodes.desc_annotation(self.visibility,
self.visibility) self.visibility)
signode += nodes.Text(' ') signode += nodes.Text(' ')
if self.virtual:
signode += addnodes.desc_annotation('virtual', 'virtual')
signode += nodes.Text(' ')
self.name.describe_signature(signode, 'markType', env, symbol=symbol) self.name.describe_signature(signode, 'markType', env, symbol=symbol)
@ -3005,11 +3011,20 @@ class DefinitionParser(object):
if self.skip_string(':'): if self.skip_string(':'):
while 1: while 1:
self.skip_ws() self.skip_ws()
virtual = False
if self.skip_string('virtual'):
virtual = True
self.skip_ws()
visibility = 'private' visibility = 'private'
if self.match(_visibility_re): if self.match(_visibility_re):
visibility = self.matched_text visibility = self.matched_text
self.skip_ws()
if self.skip_string('virtual'):
if virtual == True:
self.fail('Duplicate virtual keyword found')
virtual = True
baseName = self._parse_nested_name() baseName = self._parse_nested_name()
bases.append(ASTBaseClass(baseName, visibility)) bases.append(ASTBaseClass(baseName, visibility, virtual))
self.skip_ws() self.skip_ws()
if self.skip_string(','): if self.skip_string(','):
continue continue

View File

@ -304,6 +304,9 @@ def test_bases():
check('class', 'A : public B', "A", "1A") check('class', 'A : public B', "A", "1A")
check('class', 'A : B, C', "A", "1A") check('class', 'A : B, C', "A", "1A")
check('class', 'A : B, protected C, D', "A", "1A") check('class', 'A : B, protected C, D', "A", "1A")
check('class', 'A : virtual private B', 'A', '1A', output='A : virtual B')
check('class', 'A : B, virtual C', 'A', '1A')
check('class', 'A : public virtual B', 'A', '1A')
def test_operators(): def test_operators():