mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Merge pull request #8283 from tk0miya/7786_overloads_in_other_file
Fix #7786: autodoc: can't detect overloaded methods defined in other file
This commit is contained in:
commit
0476e1cea9
1
CHANGES
1
CHANGES
@ -42,6 +42,7 @@ Bugs fixed
|
|||||||
* #8157: autodoc: TypeError is raised when annotation has invalid __args__
|
* #8157: autodoc: TypeError is raised when annotation has invalid __args__
|
||||||
* #7964: autodoc: Tuple in default value is wrongly rendered
|
* #7964: autodoc: Tuple in default value is wrongly rendered
|
||||||
* #8200: autodoc: type aliases break type formatting of autoattribute
|
* #8200: autodoc: type aliases break type formatting of autoattribute
|
||||||
|
* #7786: autodoc: can't detect overloaded methods defined in other file
|
||||||
* #8192: napoleon: description is disappeared when it contains inline literals
|
* #8192: napoleon: description is disappeared when it contains inline literals
|
||||||
* #8142: napoleon: Potential of regex denial of service in google style docs
|
* #8142: napoleon: Potential of regex denial of service in google style docs
|
||||||
* #8169: LaTeX: pxjahyper loaded even when latex_engine is not platex
|
* #8169: LaTeX: pxjahyper loaded even when latex_engine is not platex
|
||||||
|
@ -1471,22 +1471,14 @@ class ClassDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): # type:
|
|||||||
return ''
|
return ''
|
||||||
|
|
||||||
sig = super().format_signature()
|
sig = super().format_signature()
|
||||||
|
|
||||||
overloaded = False
|
|
||||||
qualname = None
|
|
||||||
# TODO: recreate analyzer for the module of class (To be clear, owner of the method)
|
|
||||||
if self._signature_class and self._signature_method_name and self.analyzer:
|
|
||||||
qualname = '.'.join([self._signature_class.__qualname__,
|
|
||||||
self._signature_method_name])
|
|
||||||
if qualname in self.analyzer.overloads:
|
|
||||||
overloaded = True
|
|
||||||
|
|
||||||
sigs = []
|
sigs = []
|
||||||
if overloaded:
|
|
||||||
|
overloads = self.get_overloaded_signatures()
|
||||||
|
if overloads:
|
||||||
# Use signatures for overloaded methods instead of the implementation method.
|
# Use signatures for overloaded methods instead of the implementation method.
|
||||||
method = safe_getattr(self._signature_class, self._signature_method_name, None)
|
method = safe_getattr(self._signature_class, self._signature_method_name, None)
|
||||||
__globals__ = safe_getattr(method, '__globals__', {})
|
__globals__ = safe_getattr(method, '__globals__', {})
|
||||||
for overload in self.analyzer.overloads.get(qualname):
|
for overload in overloads:
|
||||||
overload = evaluate_signature(overload, __globals__,
|
overload = evaluate_signature(overload, __globals__,
|
||||||
self.env.config.autodoc_type_aliases)
|
self.env.config.autodoc_type_aliases)
|
||||||
|
|
||||||
@ -1500,6 +1492,20 @@ class ClassDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): # type:
|
|||||||
|
|
||||||
return "\n".join(sigs)
|
return "\n".join(sigs)
|
||||||
|
|
||||||
|
def get_overloaded_signatures(self) -> List[Signature]:
|
||||||
|
if self._signature_class and self._signature_method_name:
|
||||||
|
for cls in self._signature_class.__mro__:
|
||||||
|
try:
|
||||||
|
analyzer = ModuleAnalyzer.for_module(cls.__module__)
|
||||||
|
analyzer.parse()
|
||||||
|
qualname = '.'.join([cls.__qualname__, self._signature_method_name])
|
||||||
|
if qualname in analyzer.overloads:
|
||||||
|
return analyzer.overloads.get(qualname)
|
||||||
|
except PycodeError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return []
|
||||||
|
|
||||||
def add_directive_header(self, sig: str) -> None:
|
def add_directive_header(self, sig: str) -> None:
|
||||||
sourcename = self.get_sourcename()
|
sourcename = self.get_sourcename()
|
||||||
|
|
||||||
|
5
tests/roots/test-ext-autodoc/target/overload2.py
Normal file
5
tests/roots/test-ext-autodoc/target/overload2.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from target.overload import Bar
|
||||||
|
|
||||||
|
|
||||||
|
class Baz(Bar):
|
||||||
|
pass
|
@ -2002,6 +2002,22 @@ def test_overload(app):
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.sphinx('html', testroot='ext-autodoc')
|
||||||
|
def test_overload2(app):
|
||||||
|
options = {"members": None}
|
||||||
|
actual = do_autodoc(app, 'module', 'target.overload2', options)
|
||||||
|
assert list(actual) == [
|
||||||
|
'',
|
||||||
|
'.. py:module:: target.overload2',
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
'.. py:class:: Baz(x: int, y: int)',
|
||||||
|
' Baz(x: str, y: str)',
|
||||||
|
' :module: target.overload2',
|
||||||
|
'',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.sphinx('html', testroot='ext-autodoc')
|
@pytest.mark.sphinx('html', testroot='ext-autodoc')
|
||||||
def test_pymodule_for_ModuleLevelDocumenter(app):
|
def test_pymodule_for_ModuleLevelDocumenter(app):
|
||||||
app.env.ref_context['py:module'] = 'target.classes'
|
app.env.ref_context['py:module'] = 'target.classes'
|
||||||
|
Loading…
Reference in New Issue
Block a user