mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
C++, add parsing of delete expressions.
This commit is contained in:
parent
bce956d357
commit
6433e08069
1
CHANGES
1
CHANGES
@ -213,6 +213,7 @@ Bugs fixed
|
||||
* #5191: C++, prevent nested declarations in functions to avoid lookup problems.
|
||||
* #5126: C++, add missing isPack method for certain template parameter types.
|
||||
* #5187: C++, parse attributes on declerators as well.
|
||||
* C++, parse delete expressions as well.
|
||||
* #5002: graphviz: SVGs do not adapt to the column width
|
||||
|
||||
Testing
|
||||
|
@ -1106,6 +1106,38 @@ class ASTNoexceptExpr(ASTBase):
|
||||
signode.append(nodes.Text(')'))
|
||||
|
||||
|
||||
class ASTDeleteExpr(ASTBase):
|
||||
def __init__(self, rooted, array, expr):
|
||||
self.rooted = rooted
|
||||
self.array = array
|
||||
self.expr = expr
|
||||
|
||||
def _stringify(self, transform):
|
||||
res = []
|
||||
if self.rooted:
|
||||
res.append('::')
|
||||
res.append('delete ')
|
||||
if self.array:
|
||||
res.append('[] ')
|
||||
res.append(transform(self.expr))
|
||||
return u''.join(res)
|
||||
|
||||
def get_id(self, version):
|
||||
if self.array:
|
||||
id = "da"
|
||||
else:
|
||||
id = "dl"
|
||||
return id + self.expr.get_id(version)
|
||||
|
||||
def describe_signature(self, signode, mode, env, symbol):
|
||||
if self.rooted:
|
||||
signode.append(nodes.Text('::'))
|
||||
signode.append(nodes.Text('delete '))
|
||||
if self.array:
|
||||
signode.append(nodes.Text('[] '))
|
||||
self.expr.describe_signature(signode, mode, env, symbol)
|
||||
|
||||
|
||||
class ASTExplicitCast(ASTBase):
|
||||
def __init__(self, cast, typ, expr):
|
||||
assert cast in _id_explicit_cast
|
||||
@ -4571,7 +4603,26 @@ class DefinitionParser(object):
|
||||
if not self.skip_string(')'):
|
||||
self.fail("Expecting ')' to end 'noexcept'.")
|
||||
return ASTNoexceptExpr(expr)
|
||||
# TODO: the rest
|
||||
# new-expression
|
||||
pos = self.pos
|
||||
rooted = self.skip_string('::')
|
||||
self.skip_ws()
|
||||
if not self.skip_word_and_ws('new'):
|
||||
self.pos = pos
|
||||
else:
|
||||
self.fail("Sorry, new-expressions not yet supported.")
|
||||
# delete-expression
|
||||
pos = self.pos
|
||||
rooted = self.skip_string('::')
|
||||
self.skip_ws()
|
||||
if not self.skip_word_and_ws('delete'):
|
||||
self.pos = pos
|
||||
else:
|
||||
array = self.skip_string_and_ws('[')
|
||||
if array and not self.skip_string_and_ws(']'):
|
||||
self.fail("Expected ']' in array delete-expression.")
|
||||
expr = self._parse_cast_expression()
|
||||
return ASTDeleteExpr(rooted, array, expr)
|
||||
return self._parse_postfix_expression()
|
||||
|
||||
def _parse_cast_expression(self):
|
||||
@ -5776,8 +5827,8 @@ class DefinitionParser(object):
|
||||
except DefinitionError as exType:
|
||||
header = "Error when parsing (type) expression."
|
||||
errs = []
|
||||
errs.append((exExpr, "If expression:"))
|
||||
errs.append((exType, "If type:"))
|
||||
errs.append((exExpr, "If expression"))
|
||||
errs.append((exType, "If type"))
|
||||
raise self._make_multi_error(errs, header)
|
||||
return expr
|
||||
|
||||
|
@ -171,6 +171,11 @@ def test_expressions():
|
||||
exprCheck('sizeof -42', 'szngL42E')
|
||||
exprCheck('alignof(T)', 'at1T')
|
||||
exprCheck('noexcept(-42)', 'nxngL42E')
|
||||
# TODO: new-expression
|
||||
exprCheck('delete p', 'dl1p')
|
||||
exprCheck('delete [] p', 'da1p')
|
||||
exprCheck('::delete p', 'dl1p')
|
||||
exprCheck('::delete [] p', 'da1p')
|
||||
# cast
|
||||
exprCheck('(int)2', 'cviL2E')
|
||||
# binary op
|
||||
|
Loading…
Reference in New Issue
Block a user