From 0dbbf1dd540fedc470add85db0eea934c2373db6 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 17 Dec 2020 01:04:03 +0900 Subject: [PATCH] Fix #8534: autoattribute failed to document a commented attribute in alias dervied class --- sphinx/ext/autodoc/__init__.py | 19 ++++++++++++------- .../test-ext-autodoc/target/typed_vars.py | 2 +- tests/test_ext_autodoc.py | 8 +++++++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py index 9ae115ef4..2bec46859 100644 --- a/sphinx/ext/autodoc/__init__.py +++ b/sphinx/ext/autodoc/__init__.py @@ -2152,14 +2152,19 @@ class UninitializedInstanceAttributeMixin(DataDocumenterMixinBase): def get_attribute_comment(self, parent: Any) -> Optional[List[str]]: try: - analyzer = ModuleAnalyzer.for_module(self.modname) - analyzer.analyze() + for cls in inspect.getmro(parent): + try: + module = safe_getattr(cls, '__module__') + qualname = safe_getattr(cls, '__qualname__') - qualname = safe_getattr(parent, '__qualname__', None) - if qualname and self.objpath: - key = (qualname, self.objpath[-1]) - if key in analyzer.attr_docs: - return list(analyzer.attr_docs[key]) + analyzer = ModuleAnalyzer.for_module(module) + analyzer.analyze() + if qualname and self.objpath: + key = (qualname, self.objpath[-1]) + if key in analyzer.attr_docs: + return list(analyzer.attr_docs[key]) + except (AttributeError, PycodeError): + pass except (AttributeError, PycodeError): pass diff --git a/tests/roots/test-ext-autodoc/target/typed_vars.py b/tests/roots/test-ext-autodoc/target/typed_vars.py index 4e2de2398..f909b80f1 100644 --- a/tests/roots/test-ext-autodoc/target/typed_vars.py +++ b/tests/roots/test-ext-autodoc/target/typed_vars.py @@ -31,4 +31,4 @@ class Derived(Class): attr7: int -Alias = Class +Alias = Derived diff --git a/tests/test_ext_autodoc.py b/tests/test_ext_autodoc.py index a81a73b61..8d2738f1b 100644 --- a/tests/test_ext_autodoc.py +++ b/tests/test_ext_autodoc.py @@ -1564,7 +1564,7 @@ def test_autodoc_typed_instance_variables(app): '.. py:attribute:: Alias', ' :module: target.typed_vars', '', - ' alias of :class:`target.typed_vars.Class`', + ' alias of :class:`target.typed_vars.Derived`', '', '.. py:class:: Class()', ' :module: target.typed_vars', @@ -1683,16 +1683,22 @@ def test_autodoc_typed_inherited_instance_variables(app): ' :module: target.typed_vars', ' :type: int', '', + ' attr4', + '', '', ' .. py:attribute:: Derived.attr5', ' :module: target.typed_vars', ' :type: int', '', + ' attr5', + '', '', ' .. py:attribute:: Derived.attr6', ' :module: target.typed_vars', ' :type: int', '', + ' attr6', + '', '', ' .. py:attribute:: Derived.attr7', ' :module: target.typed_vars',