Skip to content

Commit

Permalink
Merge pull request #8961 from jakobandersen/c_cpp_nested_params
Browse files Browse the repository at this point in the history
C and C++, fix nested params
  • Loading branch information
jakobandersen committed Mar 5, 2021
2 parents 8514429 + 72e231d commit 6886de2
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 16 deletions.
2 changes: 2 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,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
--------
Expand Down
25 changes: 17 additions & 8 deletions sphinx/domains/c.py
Original file line number Diff line number Diff line change
Expand Up @@ -669,15 +669,24 @@ def _stringify(self, transform: StringifyTransform) -> str:
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)
Expand Down
24 changes: 16 additions & 8 deletions sphinx/domains/cpp.py
Original file line number Diff line number Diff line change
Expand Up @@ -1967,15 +1967,23 @@ def _stringify(self, transform: StringifyTransform) -> str:
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(' ')
Expand Down
3 changes: 3 additions & 0 deletions tests/test_domain_c.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"})
Expand Down
3 changes: 3 additions & 0 deletions tests/test_domain_cpp.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"})
Expand Down

0 comments on commit 6886de2

Please sign in to comment.