summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Lykke Andersen <Jakob@caput.dk>2020-09-14 21:01:41 +0200
committerJakob Lykke Andersen <Jakob@caput.dk>2020-09-14 21:16:15 +0200
commit49e7400123a10ad833af8997df58e98634091e4e (patch)
tree7214085a5f1e61552b534741f669f6e89c1b1cca
parentb5dc3adf66ff70d8d6fe076954bfd0dfd13736a6 (diff)
downloadsphinx-git-49e7400123a10ad833af8997df58e98634091e4e.tar.gz
C, fix names in get_objects()
Fixes sphinx-doc/sphinx#8160
-rw-r--r--CHANGES1
-rw-r--r--sphinx/domains/c.py26
-rw-r--r--tests/test_domain_c.py18
3 files changed, 24 insertions, 21 deletions
diff --git a/CHANGES b/CHANGES
index ae9505742..564eb799a 100644
--- a/CHANGES
+++ b/CHANGES
@@ -18,6 +18,7 @@ Bugs fixed
* #8188: C, add missing items to internal object types dictionary,
e.g., preventing intersphinx from resolving them.
+* C, fix anon objects in intersphinx.
Testing
diff --git a/sphinx/domains/c.py b/sphinx/domains/c.py
index c759dacbd..4d88bd8e8 100644
--- a/sphinx/domains/c.py
+++ b/sphinx/domains/c.py
@@ -12,7 +12,6 @@ import re
from typing import (
Any, Callable, Dict, Generator, Iterator, List, Type, TypeVar, Tuple, Union
)
-from typing import cast
from docutils import nodes
from docutils.nodes import Element, Node, TextElement, system_message
@@ -3153,10 +3152,6 @@ class CObject(ObjectDescription):
self.state.document.note_explicit_target(signode)
- domain = cast(CDomain, self.env.get_domain('c'))
- if name not in domain.objects:
- domain.objects[name] = (domain.env.docname, newestId, self.objtype)
-
if 'noindexentry' not in self.options:
indexText = self.get_index_text(name)
self.indexnode['entries'].append(('single', indexText, newestId, '', None))
@@ -3649,10 +3644,6 @@ class CDomain(Domain):
'objects': {}, # fullname -> docname, node_id, objtype
} # type: Dict[str, Union[Symbol, Dict[str, Tuple[str, str, str]]]]
- @property
- def objects(self) -> Dict[str, Tuple[str, str, str]]:
- return self.data.setdefault('objects', {}) # fullname -> docname, node_id, objtype
-
def clear_doc(self, docname: str) -> None:
if Symbol.debug_show_tree:
print("clear_doc:", docname)
@@ -3668,9 +3659,6 @@ class CDomain(Domain):
print(self.data['root_symbol'].dump(1))
print("\tafter end")
print("clear_doc end:", docname)
- for fullname, (fn, _id, _l) in list(self.objects.items()):
- if fn == docname:
- del self.objects[fullname]
def process_doc(self, env: BuildEnvironment, docname: str,
document: nodes.document) -> None:
@@ -3756,8 +3744,18 @@ class CDomain(Domain):
return []
def get_objects(self) -> Iterator[Tuple[str, str, str, str, str, int]]:
- for refname, (docname, node_id, objtype) in list(self.objects.items()):
- yield (refname, refname, objtype, docname, node_id, 1)
+ rootSymbol = self.data['root_symbol']
+ for symbol in rootSymbol.get_all_symbols():
+ if symbol.declaration is None:
+ continue
+ assert symbol.docname
+ fullNestedName = symbol.get_full_nested_name()
+ name = str(fullNestedName).lstrip('.')
+ dispname = fullNestedName.get_display_string().lstrip('.')
+ objectType = symbol.declaration.objectType
+ docname = symbol.docname
+ newestId = symbol.declaration.get_newest_id()
+ yield (name, dispname, objectType, docname, newestId, 1)
def setup(app: Sphinx) -> Dict[str, Any]:
diff --git a/tests/test_domain_c.py b/tests/test_domain_c.py
index b6f72287e..7509b1aa9 100644
--- a/tests/test_domain_c.py
+++ b/tests/test_domain_c.py
@@ -562,6 +562,13 @@ def test_build_domain_c_semicolon(app, status, warning):
assert len(ws) == 0
+def _get_obj(app, queryName):
+ domain = app.env.get_domain('c')
+ for name, dispname, objectType, docname, anchor, prio in domain.get_objects():
+ if name == queryName:
+ return (docname, anchor, objectType)
+ return (queryName, "not", "found")
+
def test_cfunction(app):
text = (".. c:function:: PyObject* "
"PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)")
@@ -569,8 +576,7 @@ def test_cfunction(app):
assert_node(doctree[1], addnodes.desc, desctype="function",
domain="c", objtype="function", noindex=False)
- domain = app.env.get_domain('c')
- entry = domain.objects.get('PyType_GenericAlloc')
+ entry = _get_obj(app, 'PyType_GenericAlloc')
assert entry == ('index', 'c.PyType_GenericAlloc', 'function')
@@ -580,8 +586,7 @@ def test_cmember(app):
assert_node(doctree[1], addnodes.desc, desctype="member",
domain="c", objtype="member", noindex=False)
- domain = app.env.get_domain('c')
- entry = domain.objects.get('PyTypeObject.tp_bases')
+ entry = _get_obj(app, 'PyTypeObject.tp_bases')
assert entry == ('index', 'c.PyTypeObject.tp_bases', 'member')
@@ -591,9 +596,8 @@ def test_cvar(app):
assert_node(doctree[1], addnodes.desc, desctype="var",
domain="c", objtype="var", noindex=False)
- domain = app.env.get_domain('c')
- entry = domain.objects.get('PyClass_Type')
- assert entry == ('index', 'c.PyClass_Type', 'var')
+ entry = _get_obj(app, 'PyClass_Type')
+ assert entry == ('index', 'c.PyClass_Type', 'member')
def test_noindexentry(app):