diff --git a/CHANGES b/CHANGES index 4595a44b5..5ab3b14dc 100644 --- a/CHANGES +++ b/CHANGES @@ -46,6 +46,8 @@ Bugs fixed * #6486: UnboundLocalError is raised if broken extension installed * #6567: autodoc: :confval:`autodoc_inherit_docstrings` does not effect to ``__init__()`` and ``__new__()`` +* #6574: autodoc: :confval:`autodoc_member_order` does not refer order of + imports when ``'bysource'`` order * #6498: autosummary: crashed with wrong autosummary_generate setting * #6507: autosummary: crashes without no autosummary_generate setting * #6511: LaTeX: autonumbered list can not be customized in LaTeX diff --git a/sphinx/pycode/parser.py b/sphinx/pycode/parser.py index cbcb3b17d..534f2310a 100644 --- a/sphinx/pycode/parser.py +++ b/sphinx/pycode/parser.py @@ -270,6 +270,22 @@ class VariableCommentPicker(ast.NodeVisitor): super().visit(node) self.previous = node + def visit_Import(self, node: ast.Import) -> None: + """Handles Import node and record it to definition orders.""" + for name in node.names: + if name.asname: + self.add_entry(name.asname) + else: + self.add_entry(name.name) + + def visit_ImportFrom(self, node: ast.Import) -> None: + """Handles Import node and record it to definition orders.""" + for name in node.names: + if name.asname: + self.add_entry(name.asname) + else: + self.add_entry(name.name) + def visit_Assign(self, node: ast.Assign) -> None: """Handles Assign node and pick up a variable comment.""" try: diff --git a/tests/test_pycode_parser.py b/tests/test_pycode_parser.py index 8f8c6cbab..b8bece84e 100644 --- a/tests/test_pycode_parser.py +++ b/tests/test_pycode_parser.py @@ -344,6 +344,22 @@ def test_async_function_and_method(): 'Foo.method': ('def', 6, 7)} +def test_imports(): + source = ('import sys\n' + 'from os import environment, path\n' + '\n' + 'import sphinx as Sphinx\n' + 'from sphinx.application import Sphinx as App\n') + parser = Parser(source) + parser.parse() + assert parser.definitions == {} + assert parser.deforders == {'sys': 0, + 'environment': 1, + 'path': 2, + 'Sphinx': 3, + 'App': 4} + + def test_formfeed_char(): source = ('class Foo:\n' '\f\n'