diff --git a/sphinx/domains/c/__init__.py b/sphinx/domains/c/__init__.py index 6dbbf70ac92..7fa1822e4ac 100644 --- a/sphinx/domains/c/__init__.py +++ b/sphinx/domains/c/__init__.py @@ -39,7 +39,7 @@ from docutils.nodes import Element, Node, TextElement, system_message - from sphinx.addnodes import pending_xref + from sphinx.addnodes import desc_signature, pending_xref from sphinx.application import Sphinx from sphinx.builders import Builder from sphinx.domains.c._symbol import LookupKey @@ -309,6 +309,32 @@ def after_content(self) -> None: self.env.current_document.c_parent_symbol = self.oldParentSymbol self.env.ref_context['c:parent_key'] = self.oldParentKey + def _object_hierarchy_parts(self, sig_node: desc_signature) -> tuple[str, ...]: + last_symbol: Symbol = self.env.current_document.c_last_symbol + return tuple(map(str, last_symbol.get_full_nested_name().names)) + + def _toc_entry_name(self, sig_node: desc_signature) -> str: + if not sig_node.get('_toc_parts'): + return '' + + config = self.config + objtype = sig_node.parent.get('objtype') + if config.add_function_parentheses and ( + objtype in {'function', 'method'} + or (objtype == 'macro' and '(' in sig_node.rawsource) + ): + parens = '()' + else: + parens = '' + *parents, name = sig_node['_toc_parts'] + if config.toc_object_entries_show_parents == 'domain': + return '::'.join((name + parens,)) + if config.toc_object_entries_show_parents == 'hide': + return name + parens + if config.toc_object_entries_show_parents == 'all': + return '::'.join([*parents, name + parens]) + return '' + class CMemberObject(CObject): object_type = 'member'