From 7d836e16aba8a48525dd731ea3db65b8e895b72c Mon Sep 17 00:00:00 2001 From: Rapptz Date: Thu, 1 Oct 2015 02:17:33 -0400 Subject: [PATCH] C++, add support for virtual base classes --- CHANGES | 1 + sphinx/domains/cpp.py | 19 +++++++++++++++++-- tests/test_domain_cpp.py | 3 +++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 9c3ed67c8..816f64926 100644 --- a/CHANGES +++ b/CHANGES @@ -66,6 +66,7 @@ Bugs fixed transforming. * C++, fix parsing of 'signed char' and 'unsigned char' as types. * C++, add missing support for 'friend' functions. +* C++, add support for virtual bases. Documentation ------------- diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index 2b224ef4a..93fde2610 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -1845,15 +1845,18 @@ class ASTTypeUsing(ASTBase): class ASTBaseClass(ASTBase): - def __init__(self, name, visibility): + def __init__(self, name, visibility, virtual): self.name = name self.visibility = visibility + self.virtual = virtual def __unicode__(self): res = [] if self.visibility != 'private': res.append(self.visibility) res.append(' ') + if self.virtual: + res.append('virtual ') res.append(text_type(self.name)) return u''.join(res) @@ -1863,6 +1866,9 @@ class ASTBaseClass(ASTBase): signode += addnodes.desc_annotation(self.visibility, self.visibility) signode += nodes.Text(' ') + if self.virtual: + signode += addnodes.desc_annotation('virtual', 'virtual') + signode += nodes.Text(' ') self.name.describe_signature(signode, 'markType', env, symbol=symbol) @@ -3005,11 +3011,20 @@ class DefinitionParser(object): if self.skip_string(':'): while 1: self.skip_ws() + virtual = False + if self.skip_string('virtual'): + virtual = True + self.skip_ws() visibility = 'private' if self.match(_visibility_re): 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() - bases.append(ASTBaseClass(baseName, visibility)) + bases.append(ASTBaseClass(baseName, visibility, virtual)) self.skip_ws() if self.skip_string(','): continue diff --git a/tests/test_domain_cpp.py b/tests/test_domain_cpp.py index 178981294..615ff3a21 100644 --- a/tests/test_domain_cpp.py +++ b/tests/test_domain_cpp.py @@ -304,6 +304,9 @@ def test_bases(): check('class', 'A : public B', "A", "1A") check('class', 'A : B, C', "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():