diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2021-07-07 02:09:50 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-07 02:09:50 +0900 |
commit | 5e5bca98f752cb61c36afc7955183e79a6095cf2 (patch) | |
tree | 66fc9448a4bbab736469fdad514dfa970787d495 /sphinx/domains/python.py | |
parent | 988a79de65737e403cd27721ce091760cf62b97f (diff) | |
parent | f0fef96906d80d89e290a780767a92ba85977733 (diff) | |
download | sphinx-git-5e5bca98f752cb61c36afc7955183e79a6095cf2.tar.gz |
Merge branch '4.x' into 6525_linkcheck_warn_redirects
Diffstat (limited to 'sphinx/domains/python.py')
-rw-r--r-- | sphinx/domains/python.py | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py index 7fb56c635..5c2acf18b 100644 --- a/sphinx/domains/python.py +++ b/sphinx/domains/python.py @@ -20,6 +20,7 @@ from typing import Any, Dict, Iterable, Iterator, List, NamedTuple, Optional, Tu from docutils import nodes from docutils.nodes import Element, Node from docutils.parsers.rst import directives +from docutils.parsers.rst.states import Inliner from sphinx import addnodes from sphinx.addnodes import desc_signature, pending_xref, pending_xref_condition @@ -284,9 +285,13 @@ def _pseudo_parse_arglist(signode: desc_signature, arglist: str) -> None: class PyXrefMixin: def make_xref(self, rolename: str, domain: str, target: str, innernode: Type[TextlikeNode] = nodes.emphasis, - contnode: Node = None, env: BuildEnvironment = None) -> Node: + contnode: Node = None, env: BuildEnvironment = None, + inliner: Inliner = None, location: Node = None) -> Node: + # we use inliner=None to make sure we get the old behaviour with a single + # pending_xref node result = super().make_xref(rolename, domain, target, # type: ignore - innernode, contnode, env) + innernode, contnode, + env, inliner=None, location=None) result['refspecific'] = True result['py:module'] = env.ref_context.get('py:module') result['py:class'] = env.ref_context.get('py:class') @@ -299,11 +304,22 @@ class PyXrefMixin: for node in result.traverse(nodes.Text): node.parent[node.parent.index(node)] = nodes.Text(text) break + elif isinstance(result, pending_xref) and env.config.python_use_unqualified_type_names: + children = result.children + result.clear() + + shortname = target.split('.')[-1] + textnode = innernode('', shortname) + contnodes = [pending_xref_condition('', '', textnode, condition='resolved'), + pending_xref_condition('', '', *children, condition='*')] + result.extend(contnodes) + return result def make_xrefs(self, rolename: str, domain: str, target: str, innernode: Type[TextlikeNode] = nodes.emphasis, - contnode: Node = None, env: BuildEnvironment = None) -> List[Node]: + contnode: Node = None, env: BuildEnvironment = None, + inliner: Inliner = None, location: Node = None) -> List[Node]: delims = r'(\s*[\[\]\(\),](?:\s*or\s)?\s*|\s+or\s+|\s*\|\s*|\.\.\.)' delims_re = re.compile(delims) sub_targets = re.split(delims, target) @@ -319,7 +335,7 @@ class PyXrefMixin: results.append(contnode or innernode(sub_target, sub_target)) else: results.append(self.make_xref(rolename, domain, sub_target, - innernode, contnode, env)) + innernode, contnode, env, inliner, location)) return results @@ -327,12 +343,14 @@ class PyXrefMixin: class PyField(PyXrefMixin, Field): def make_xref(self, rolename: str, domain: str, target: str, innernode: Type[TextlikeNode] = nodes.emphasis, - contnode: Node = None, env: BuildEnvironment = None) -> Node: + contnode: Node = None, env: BuildEnvironment = None, + inliner: Inliner = None, location: Node = None) -> Node: if rolename == 'class' and target == 'None': # None is not a type, so use obj role instead. rolename = 'obj' - return super().make_xref(rolename, domain, target, innernode, contnode, env) + return super().make_xref(rolename, domain, target, innernode, contnode, + env, inliner, location) class PyGroupedField(PyXrefMixin, GroupedField): @@ -342,12 +360,14 @@ class PyGroupedField(PyXrefMixin, GroupedField): class PyTypedField(PyXrefMixin, TypedField): def make_xref(self, rolename: str, domain: str, target: str, innernode: Type[TextlikeNode] = nodes.emphasis, - contnode: Node = None, env: BuildEnvironment = None) -> Node: + contnode: Node = None, env: BuildEnvironment = None, + inliner: Inliner = None, location: Node = None) -> Node: if rolename == 'class' and target == 'None': # None is not a type, so use obj role instead. rolename = 'obj' - return super().make_xref(rolename, domain, target, innernode, contnode, env) + return super().make_xref(rolename, domain, target, innernode, contnode, + env, inliner, location) class PyObject(ObjectDescription[Tuple[str, str]]): |