C and C++, fix nested paramter lists

This commit is contained in:
Jakob Lykke Andersen 2021-03-04 21:28:18 +01:00
parent cba9ed0bb5
commit 72e231d0e6
5 changed files with 41 additions and 16 deletions

View File

@ -93,6 +93,8 @@ Bugs fixed
* C, properly reject function declarations when a keyword is used
as parameter name.
* #8933: viewcode: Failed to create back-links on parallel build
* #8960: C and C++, fix rendering of (member) function pointer types in
function parameter lists.
Testing
--------

View File

@ -669,15 +669,24 @@ class ASTParameters(ASTBase):
def describe_signature(self, signode: TextElement, mode: str,
env: "BuildEnvironment", symbol: "Symbol") -> None:
verify_description_mode(mode)
paramlist = addnodes.desc_parameterlist()
for arg in self.args:
param = addnodes.desc_parameter('', '', noemph=True)
if mode == 'lastIsName': # i.e., outer-function params
# only use the desc_parameterlist for the outer list, not for inner lists
if mode == 'lastIsName':
paramlist = addnodes.desc_parameterlist()
for arg in self.args:
param = addnodes.desc_parameter('', '', noemph=True)
arg.describe_signature(param, 'param', env, symbol=symbol)
else:
arg.describe_signature(param, 'markType', env, symbol=symbol)
paramlist += param
signode += paramlist
paramlist += param
signode += paramlist
else:
signode += nodes.Text('(', '(')
first = True
for arg in self.args:
if not first:
signode += nodes.Text(', ', ', ')
first = False
arg.describe_signature(signode, 'markType', env, symbol=symbol)
signode += nodes.Text(')', ')')
for attr in self.attrs:
signode += nodes.Text(' ')
attr.describe_signature(signode)

View File

@ -1967,15 +1967,23 @@ class ASTParametersQualifiers(ASTBase):
def describe_signature(self, signode: TextElement, mode: str,
env: "BuildEnvironment", symbol: "Symbol") -> None:
verify_description_mode(mode)
paramlist = addnodes.desc_parameterlist()
for arg in self.args:
param = addnodes.desc_parameter('', '', noemph=True)
if mode == 'lastIsName': # i.e., outer-function params
# only use the desc_parameterlist for the outer list, not for inner lists
if mode == 'lastIsName':
paramlist = addnodes.desc_parameterlist()
for arg in self.args:
param = addnodes.desc_parameter('', '', noemph=True)
arg.describe_signature(param, 'param', env, symbol=symbol)
else:
arg.describe_signature(param, 'markType', env, symbol=symbol)
paramlist += param
signode += paramlist
paramlist += param
signode += paramlist
else:
signode += nodes.Text('(', '(')
first = True
for arg in self.args:
if not first:
signode += nodes.Text(', ', ', ')
first = False
arg.describe_signature(signode, 'markType', env, symbol=symbol)
signode += nodes.Text(')', ')')
def _add_anno(signode: TextElement, text: str) -> None:
signode += nodes.Text(' ')

View File

@ -420,6 +420,9 @@ def test_function_definitions():
with pytest.raises(DefinitionError):
parse('function', 'void f(int for)')
# from #8960
check('function', 'void f(void (*p)(int, double), int i)', {1: 'f'})
def test_nested_name():
check('struct', '{key}.A', {1: "A"})

View File

@ -619,6 +619,9 @@ def test_function_definitions():
# from breathe#441
check('function', 'auto MakeThingy() -> Thingy*', {1: 'MakeThingy', 2: '10MakeThingyv'})
# from #8960
check('function', 'void f(void (*p)(int, double), int i)', {2: '1fPFvidEi'})
def test_operators():
check('function', 'void operator new()', {1: "new-operator", 2: "nwv"})