From 8e864076a93a837a2ece51367f7844a7000fa2ee Mon Sep 17 00:00:00 2001 From: Jakob Lykke Andersen Date: Thu, 1 Oct 2015 17:25:07 +0900 Subject: [PATCH] C++, add support for final classes. --- CHANGES | 3 ++- sphinx/domains/cpp.py | 15 +++++++++++---- tests/test_domain_cpp.py | 4 ++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index b9f526d8c..47a6c6aa0 100644 --- a/CHANGES +++ b/CHANGES @@ -66,7 +66,8 @@ 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 (thanks to Rapptz). +* C++, add missing support for virtual base classes (thanks to Rapptz). +* C++, add support for final classes. Documentation ------------- diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index 0d2bc77a6..fb99dc540 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -210,8 +210,7 @@ from sphinx.util.docfields import Field, GroupedField class_object: goal: a class declaration, but with specification of a base class grammar: - nested-name - | nested-name ":" base-specifier-list + nested-name "final"[opt] (":" base-specifier-list)[opt] base-specifier-list -> base-specifier | base-specifier-list, base-specifier @@ -1878,8 +1877,9 @@ class ASTBaseClass(ASTBase): class ASTClass(ASTBase): - def __init__(self, name, bases): + def __init__(self, name, final, bases): self.name = name + self.final = final self.bases = bases def get_id_v1(self, objectType, symbol): @@ -1891,6 +1891,8 @@ class ASTClass(ASTBase): def __unicode__(self): res = [] res.append(text_type(self.name)) + if self.final: + res.append(' final') if len(self.bases) > 0: res.append(' : ') first = True @@ -1904,6 +1906,9 @@ class ASTClass(ASTBase): def describe_signature(self, signode, mode, env, symbol): _verify_description_mode(mode) self.name.describe_signature(signode, mode, env, symbol=symbol) + if self.final: + signode += nodes.Text(' ') + signode += addnodes.desc_annotation('final', 'final') if len(self.bases) > 0: signode += nodes.Text(' : ') for b in self.bases: @@ -3011,6 +3016,8 @@ class DefinitionParser(object): def _parse_class(self): name = self._parse_nested_name() + self.skip_ws() + final = self.skip_word_and_ws('final') bases = [] self.skip_ws() if self.skip_string(':'): @@ -3032,7 +3039,7 @@ class DefinitionParser(object): continue else: break - return ASTClass(name, bases) + return ASTClass(name, final, bases) def _parse_enum(self): scoped = None # is set by CPPEnumObject diff --git a/tests/test_domain_cpp.py b/tests/test_domain_cpp.py index 615ff3a21..b0a3775b5 100644 --- a/tests/test_domain_cpp.py +++ b/tests/test_domain_cpp.py @@ -296,6 +296,10 @@ def test_templates(): None, "I0E5allowP1FN4funcI1F1BXG!=1EE4typeE") +def test_class(): + check('class', 'A final', 'A', '1A') + + def test_bases(): check('class', 'A', "A", "1A") check('class', 'A::B::C', "A::B::C", "N1A1B1CE")