Skip to content

Commit 8e86407

Browse files
committed
C++, add support for final classes.
1 parent bf25b48 commit 8e86407

File tree

3 files changed

+17
-5
lines changed

3 files changed

+17
-5
lines changed

CHANGES

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ 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 (thanks to Rapptz).
69+
* C++, add missing support for virtual base classes (thanks to Rapptz).
70+
* C++, add support for final classes.
7071

7172
Documentation
7273
-------------

sphinx/domains/cpp.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,7 @@
210210
class_object:
211211
goal: a class declaration, but with specification of a base class
212212
grammar:
213-
nested-name
214-
| nested-name ":" base-specifier-list
213+
nested-name "final"[opt] (":" base-specifier-list)[opt]
215214
base-specifier-list ->
216215
base-specifier
217216
| base-specifier-list, base-specifier
@@ -1878,8 +1877,9 @@ def describe_signature(self, signode, mode, env, symbol):
18781877

18791878

18801879
class ASTClass(ASTBase):
1881-
def __init__(self, name, bases):
1880+
def __init__(self, name, final, bases):
18821881
self.name = name
1882+
self.final = final
18831883
self.bases = bases
18841884

18851885
def get_id_v1(self, objectType, symbol):
@@ -1891,6 +1891,8 @@ def get_id_v2(self, objectType, symbol):
18911891
def __unicode__(self):
18921892
res = []
18931893
res.append(text_type(self.name))
1894+
if self.final:
1895+
res.append(' final')
18941896
if len(self.bases) > 0:
18951897
res.append(' : ')
18961898
first = True
@@ -1904,6 +1906,9 @@ def __unicode__(self):
19041906
def describe_signature(self, signode, mode, env, symbol):
19051907
_verify_description_mode(mode)
19061908
self.name.describe_signature(signode, mode, env, symbol=symbol)
1909+
if self.final:
1910+
signode += nodes.Text(' ')
1911+
signode += addnodes.desc_annotation('final', 'final')
19071912
if len(self.bases) > 0:
19081913
signode += nodes.Text(' : ')
19091914
for b in self.bases:
@@ -3011,6 +3016,8 @@ def _parse_type_using(self):
30113016

30123017
def _parse_class(self):
30133018
name = self._parse_nested_name()
3019+
self.skip_ws()
3020+
final = self.skip_word_and_ws('final')
30143021
bases = []
30153022
self.skip_ws()
30163023
if self.skip_string(':'):
@@ -3032,7 +3039,7 @@ def _parse_class(self):
30323039
continue
30333040
else:
30343041
break
3035-
return ASTClass(name, bases)
3042+
return ASTClass(name, final, bases)
30363043

30373044
def _parse_enum(self):
30383045
scoped = None # is set by CPPEnumObject

tests/test_domain_cpp.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,10 @@ def test_templates():
296296
None, "I0E5allowP1FN4funcI1F1BXG!=1EE4typeE")
297297

298298

299+
def test_class():
300+
check('class', 'A final', 'A', '1A')
301+
302+
299303
def test_bases():
300304
check('class', 'A', "A", "1A")
301305
check('class', 'A::B::C', "A::B::C", "N1A1B1CE")

0 commit comments

Comments
 (0)