C++, properly use desc_addname in declarations.

This meant that the prefix was not rendered in code font,
and it broke Breathe.

Fixes michaeljones/breathe#374

Example:

.. cpp:class:: A

.. cpp:member:: A::b

	``A::`` not rendered properly.
This commit is contained in:
Jakob Lykke Andersen 2018-05-18 21:27:27 +02:00
parent ba4b9c0131
commit 4cf1b48947
2 changed files with 13 additions and 4 deletions

View File

@ -25,6 +25,7 @@ Bugs fixed
* #4962: C++, raised TypeError on duplicate declaration. * #4962: C++, raised TypeError on duplicate declaration.
* #4825: C++, properly parse expr roles and give better error messages when * #4825: C++, properly parse expr roles and give better error messages when
(escaped) line breaks are present. (escaped) line breaks are present.
* C++, properly use ``desc_addname`` nodes for prefixes of names.
* #4915, #4916: links on search page are broken when using dirhtml builder * #4915, #4916: links on search page are broken when using dirhtml builder
Testing Testing

View File

@ -1965,26 +1965,34 @@ class ASTNestedName(ASTBase):
prefix = '' # type: unicode prefix = '' # type: unicode
first = True first = True
names = self.names[:-1] if mode == 'lastIsName' else self.names names = self.names[:-1] if mode == 'lastIsName' else self.names
# If lastIsName, then wrap all of the prefix in a desc_addname,
# else append directly to signode.
# NOTE: Breathe relies on the prefix being in the desc_addname node,
# so it can remove it in inner declarations.
dest = signode
if mode == 'lastIsName':
dest = addnodes.desc_addname()
for i in range(len(names)): for i in range(len(names)):
name = names[i] name = names[i]
template = self.templates[i] template = self.templates[i]
if not first: if not first:
signode += nodes.Text('::') dest += nodes.Text('::')
prefix += '::' prefix += '::'
if template: if template:
signode += nodes.Text("template ") dest += nodes.Text("template ")
first = False first = False
if name != '': if name != '':
if (name.templateArgs and # type: ignore if (name.templateArgs and # type: ignore
iTemplateParams < len(templateParams)): iTemplateParams < len(templateParams)):
templateParamsPrefix += text_type(templateParams[iTemplateParams]) templateParamsPrefix += text_type(templateParams[iTemplateParams])
iTemplateParams += 1 iTemplateParams += 1
name.describe_signature(signode, 'markType', # type: ignore name.describe_signature(dest, 'markType', # type: ignore
env, templateParamsPrefix + prefix, symbol) env, templateParamsPrefix + prefix, symbol)
prefix += text_type(name) prefix += text_type(name)
if mode == 'lastIsName': if mode == 'lastIsName':
if len(self.names) > 1: if len(self.names) > 1:
signode += addnodes.desc_addname('::', '::') dest += addnodes.desc_addname('::', '::')
signode += dest
if self.templates[-1]: if self.templates[-1]:
signode += nodes.Text("template ") signode += nodes.Text("template ")
self.names[-1].describe_signature(signode, mode, env, '', symbol) self.names[-1].describe_signature(signode, mode, env, '', symbol)