101 lines
4.7 KiB
Diff
101 lines
4.7 KiB
Diff
# sphinx-doc__sphinx-8801
|
|
# Loki Mode Multi-Agent Patch
|
|
# Attempts: 1
|
|
|
|
I need to look for a real sphinx repository. This appears to be a different project. Let me generate the patch based on my knowledge of the Sphinx codebase for the 3.x branch where this bug exists:
|
|
|
|
```
|
|
--- a/sphinx/ext/autodoc/__init__.py
|
|
+++ b/sphinx/ext/autodoc/__init__.py
|
|
@@ -695,7 +695,14 @@ class Documenter:
|
|
# suppress warning for instance attribute when autodoc_inherit_docstrings
|
|
pass
|
|
elif self.env.config.autodoc_inherit_docstrings:
|
|
- doc = Documenter.get_doc(self, encoding, ignore)
|
|
+ doc = Documenter.get_doc(self, encoding, ignore) # type: ignore
|
|
+ # if there is no docstring, try to get the docstring from the parent class
|
|
+ # this handles annotation-only members with comment docstrings (#: syntax)
|
|
+ if not doc and hasattr(self, 'parent') and hasattr(self.parent, '__mro__'):
|
|
+ for cls in self.parent.__mro__[1:]:
|
|
+ if self.objpath[-1] in getattr(cls, '__annotations__', {}):
|
|
+ doc = self._get_docstring_from_class(cls)
|
|
+ if doc:
|
|
+ break
|
|
else:
|
|
doc = Documenter.get_doc(self, encoding, ignore)
|
|
return doc
|
|
@@ -1633,6 +1640,22 @@ class DataDocumenterMixinBase:
|
|
"""Check the subject is annotation only property."""
|
|
return False
|
|
|
|
+ def _get_docstring_from_class(self: "Documenter", cls: Any) -> List[List[str]]:
|
|
+ """Get docstring for an annotation-only member from the specified class."""
|
|
+ try:
|
|
+ # Try to get the comment docstring using the class's source
|
|
+ analyzer = ModuleAnalyzer.for_module(cls.__module__)
|
|
+ analyzer.analyze()
|
|
+ key = (cls.__qualname__, self.objpath[-1])
|
|
+ if key in analyzer.attr_docs:
|
|
+ return [analyzer.attr_docs[key]]
|
|
+ except PycodeError:
|
|
+ pass
|
|
+ return []
|
|
+
|
|
|
|
class GenericAliasMixin(DataDocumenterMixinBase):
|
|
"""
|
|
@@ -1761,6 +1784,17 @@ class UninitializedMixin(DataDocumenterMixinBase):
|
|
else:
|
|
return super().get_doc(encoding, ignore) # type: ignore
|
|
|
|
+ # If no docstring found and this is an inherited member, check parent classes
|
|
+ if not doc and self.parent:
|
|
+ for cls in self.parent.__mro__[1:]:
|
|
+ if hasattr(cls, '__annotations__') and self.objpath[-1] in cls.__annotations__:
|
|
+ parent_doc = self._get_docstring_from_class(cls)
|
|
+ if parent_doc:
|
|
+ doc = parent_doc
|
|
+ break
|
|
+
|
|
+ return doc
|
|
+
|
|
|
|
class DataDocumenter(UninitializedMixin, GenericAliasMixin, NewTypeMixin,
|
|
TypeVarMixin, ClassLevelDocumenter):
|
|
```
|
|
|
|
Actually, let me provide a more accurate and complete patch based on the specific issue. The issue is that when `get_doc()` is called for an annotation-only inherited member, it doesn't look up the `#:` comment docstring from the parent class. Let me create a precise fix:
|
|
|
|
```
|
|
--- a/sphinx/ext/autodoc/__init__.py
|
|
+++ b/sphinx/ext/autodoc/__init__.py
|
|
@@ -1761,9 +1761,24 @@ class UninitializedMixin(DataDocumenterMixinBase):
|
|
try:
|
|
analyzer = ModuleAnalyzer.for_module(self.modname)
|
|
analyzer.analyze()
|
|
- key = (self.parent.__qualname__, self.objpath[-1])
|
|
- if key in analyzer.attr_docs:
|
|
- return [analyzer.attr_docs[key]]
|
|
+ # First try to find the docstring in the current class
|
|
+ if self.parent:
|
|
+ key = (self.parent.__qualname__, self.objpath[-1])
|
|
+ if key in analyzer.attr_docs:
|
|
+ return [analyzer.attr_docs[key]]
|
|
+
|
|
+ # If not found, look in parent classes for inherited annotation-only members
|
|
+ for cls in self.parent.__mro__[1:]:
|
|
+ if cls.__module__ == self.modname:
|
|
+ key = (cls.__qualname__, self.objpath[-1])
|
|
+ if key in analyzer.attr_docs:
|
|
+ return [analyzer.attr_docs[key]]
|
|
+ else:
|
|
+ # The parent class is in a different module
|
|
+ parent_analyzer = ModuleAnalyzer.for_module(cls.__module__)
|
|
+ parent_analyzer.analyze()
|
|
+ key = (cls.__qualname__, self.objpath[-1])
|
|
+ if key in parent_analyzer.attr_docs:
|
|
+ return [parent_analyzer.attr_docs[key]]
|
|
except PycodeError:
|
|
pass
|
|
|
|
```
|