diff --git a/CHANGES b/CHANGES index 250f13c00..1168fa8f6 100644 --- a/CHANGES +++ b/CHANGES @@ -56,6 +56,10 @@ Features added Bugs fixed ---------- +* #9504: autodoc: generate incorrect reference to the parent class if the target + class inherites the class having ``_name`` attribute +* #9537: autodoc: Some objects under ``typing`` module are not displayed well + with the HEAD of 3.10 * #9512: sphinx-build: crashed with the HEAD of Python 3.10 Testing diff --git a/sphinx/util/typing.py b/sphinx/util/typing.py index 78feb6492..78b0b5b0a 100644 --- a/sphinx/util/typing.py +++ b/sphinx/util/typing.py @@ -157,7 +157,9 @@ def _restify_py37(cls: Optional[Type]) -> str: args = ', '.join(restify(a) for a in cls.__args__) return ':obj:`~typing.Union`\\ [%s]' % args elif inspect.isgenericalias(cls): - if getattr(cls, '_name', None): + if isinstance(cls.__origin__, typing._SpecialForm): + text = restify(cls.__origin__) # type: ignore + elif getattr(cls, '_name', None): if cls.__module__ == 'typing': text = ':class:`~%s.%s`' % (cls.__module__, cls._name) else: @@ -180,12 +182,8 @@ def _restify_py37(cls: Optional[Type]) -> str: text += r"\ [%s]" % ", ".join(restify(a) for a in cls.__args__) return text - elif hasattr(cls, '_name'): - # SpecialForm - if cls.__module__ == 'typing': - return ':obj:`~%s.%s`' % (cls.__module__, cls._name) - else: - return ':obj:`%s.%s`' % (cls.__module__, cls._name) + elif isinstance(cls, typing._SpecialForm): + return ':obj:`~%s.%s`' % (cls.__module__, cls._name) elif hasattr(cls, '__qualname__'): if cls.__module__ == 'typing': return ':class:`~%s.%s`' % (cls.__module__, cls.__qualname__) @@ -360,7 +358,7 @@ def _stringify_py37(annotation: Any) -> str: if not isinstance(annotation.__args__, (list, tuple)): # broken __args__ found pass - elif qualname == 'Union': + elif qualname in ('Optional', 'Union'): if len(annotation.__args__) > 1 and annotation.__args__[-1] is NoneType: if len(annotation.__args__) > 2: args = ', '.join(stringify(a) for a in annotation.__args__[:-1])