summaryrefslogtreecommitdiff
path: root/sphinx/domains/cpp.py
diff options
context:
space:
mode:
authorTres Walsh <tres.walsh@mnmlstc.com>2013-08-07 09:24:32 -0700
committerTres Walsh <tres.walsh@mnmlstc.com>2013-08-07 09:24:32 -0700
commit4c35b5898bed4c2af42a641ca5e24451cd9db2a4 (patch)
tree365ffc8e1d65764c483264435a10bac9902da3fb /sphinx/domains/cpp.py
parent1a81abf4003128a2478e1a3800d851e3781262ee (diff)
downloadsphinx-4c35b5898bed4c2af42a641ca5e24451cd9db2a4.tar.gz
Add support for C++11 member function ref-qualifiers and C++03 volatile member function ref-qualifier
Specifically, support for the following has been added: * rvalue reference for *this * volatile * override keyword support Additionally support for '= default' and '= delete' has been added. Several tests have also been added to test_cpp_domain.py to insure that these features actually work.
Diffstat (limited to 'sphinx/domains/cpp.py')
-rw-r--r--sphinx/domains/cpp.py78
1 files changed, 61 insertions, 17 deletions
diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py
index 9307d3a4..377130b8 100644
--- a/sphinx/domains/cpp.py
+++ b/sphinx/domains/cpp.py
@@ -448,15 +448,21 @@ class MemberObjDefExpr(NamedDefExpr):
class FuncDefExpr(NamedDefExpr):
def __init__(self, name, visibility, static, explicit, constexpr, rv,
- signature, const, noexcept, pure_virtual):
+ signature, **kwargs):
NamedDefExpr.__init__(self, name, visibility, static)
self.rv = rv
self.signature = signature
self.explicit = explicit
self.constexpr = constexpr
- self.const = const
- self.noexcept = noexcept
- self.pure_virtual = pure_virtual
+ self.const = kwargs.get('const', False)
+ self.volatile = kwargs.get('volatile', False)
+ self.noexcept = kwargs.get('noexcept', False)
+ self.override = kwargs.get('override', False)
+ self.rvalue_this = kwargs.get('rvalue_this', False)
+ self.lvalue_this = kwargs.get('lvalue_this', False)
+ self.pure_virtual = kwargs.get('pure_virtual', False)
+ self.delete = kwargs.get('delete', False)
+ self.default = kwargs.get('default', False)
def get_id(self):
return u'%s%s%s%s' % (
@@ -479,10 +485,22 @@ class FuncDefExpr(NamedDefExpr):
map(unicode, self.signature))))
if self.const:
buf.append(u'const')
+ if self.volatile:
+ buf.append(u'volatile')
+ if self.rvalue_this:
+ buf.append(u'&&')
+ if self.lvalue_this:
+ buf.append(u'&')
if self.noexcept:
buf.append(u'noexcept')
+ if self.override:
+ buf.append(u'override')
if self.pure_virtual:
buf.append(u'= 0')
+ if self.default:
+ buf.append(u'= default')
+ if self.delete:
+ buf.append(u'= delete')
return u' '.join(buf)
@@ -835,20 +853,46 @@ class DefinitionParser(object):
args.append(ArgumentDefExpr(argtype, argname,
type_suffixes, default))
self.skip_ws()
- const = self.skip_word_and_ws('const')
- noexcept = self.skip_word_and_ws('noexcept')
+ attributes = dict(
+ signature=args,
+ const=self.skip_word_and_ws('const'),
+ volatile=self.skip_word_and_ws('volatile'),
+ noexcept=self.skip_word_and_ws('noexcept'),
+ override=self.skip_word_and_ws('override'),
+ pure_virtual=False,
+ lvalue_this=False,
+ rvalue_this=False,
+ delete=False,
+ default=False)
+
+ if self.skip_string('&&'):
+ attributes['rvalue_this'] = True
+ if self.skip_string('&'):
+ attributes['lvalue_this'] = True
+
+ if attributes['lvalue_this'] and attributes['rvalue_this']:
+ self.fail('rvalue reference for *this specifier must be one of'
+ '"&&" or "&"')
+
if self.skip_string('='):
self.skip_ws()
- if not (self.skip_string('0') or \
- self.skip_word('NULL') or \
- self.skip_word('nullptr')):
- self.fail('pure virtual functions must be defined with '
- 'either 0, NULL or nullptr, other macros are '
- 'not allowed')
- pure_virtual = True
- else:
- pure_virtual = False
- return args, const, noexcept, pure_virtual
+ if self.skip_string('0'):
+ attributes['pure_virtual'] = True
+ return attributes
+ if self.skip_word('NULL') or self.skip_word('nullptr'):
+ attributes['pure_virtual'] = True
+ return attributes
+ if self.skip_word('delete'):
+ attributes['delete'] = True
+ return attributes
+ if self.skip_word('default'):
+ attributes['default'] = True
+ return attributes
+
+ self.fail('functions must be defined with '
+ 'either 0, NULL, nullptr, default or delete, other'
+ 'macros are not allowed')
+ return attributes
def _parse_visibility_static(self):
visibility = 'public'
@@ -900,7 +944,7 @@ class DefinitionParser(object):
else:
name = self._parse_type()
return FuncDefExpr(name, visibility, static, explicit, constexpr, rv,
- *self._parse_signature())
+ **self._parse_signature())
def parse_class(self):
visibility, static = self._parse_visibility_static()