diff options
author | Ashley Whetter <ashley@awhetter.co.uk> | 2021-01-30 22:40:55 -0800 |
---|---|---|
committer | Ashley Whetter <ashley@awhetter.co.uk> | 2021-01-31 09:47:19 -0800 |
commit | 217aa531a438c3b25cea8ecfd1bb0b834f5bc4f8 (patch) | |
tree | ce9f320767e20e60e7138913173bcee0ee260208 | |
parent | 5f67396894c79c4661e357ec8bb03aa134a51109 (diff) | |
download | astroid-git-fix_851.tar.gz |
Corrected the parent of function type comment nodesfix_851
These nodes used to be parented to their original ast.FunctionDef parent
but are now correctly parented to their astroid.FunctionDef parent.
Closes #851
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | astroid/rebuilder.py | 8 | ||||
-rw-r--r-- | tests/unittest_nodes.py | 13 |
3 files changed, 24 insertions, 4 deletions
@@ -119,6 +119,13 @@ Release Date: TBA Close PyCQA/pylint#3904 +* Corrected the parent of function type comment nodes. + + These nodes used to be parented to their original ast.FunctionDef parent + but are now correctly parented to their astroid.FunctionDef parent. + + Close PyCQA/astroid#851 + What's New in astroid 2.4.2? ============================ diff --git a/astroid/rebuilder.py b/astroid/rebuilder.py index 3fc1a83f..e56abbf8 100644 --- a/astroid/rebuilder.py +++ b/astroid/rebuilder.py @@ -238,7 +238,7 @@ class TreeRebuilder: return type_object.value - def check_function_type_comment(self, node): + def check_function_type_comment(self, node, parent): type_comment = getattr(node, "type_comment", None) if not type_comment: return None @@ -251,10 +251,10 @@ class TreeRebuilder: returns = None argtypes = [ - self.visit(elem, node) for elem in (type_comment_ast.argtypes or []) + self.visit(elem, parent) for elem in (type_comment_ast.argtypes or []) ] if type_comment_ast.returns: - returns = self.visit(type_comment_ast.returns, node) + returns = self.visit(type_comment_ast.returns, parent) return returns, argtypes @@ -615,7 +615,7 @@ class TreeRebuilder: returns = None type_comment_args = type_comment_returns = None - type_comment_annotation = self.check_function_type_comment(node) + type_comment_annotation = self.check_function_type_comment(node, newnode) if type_comment_annotation: type_comment_returns, type_comment_args = type_comment_annotation newnode.postinit( diff --git a/tests/unittest_nodes.py b/tests/unittest_nodes.py index d138ee17..0ba6b3e5 100644 --- a/tests/unittest_nodes.py +++ b/tests/unittest_nodes.py @@ -1181,6 +1181,19 @@ def test_type_comments_posonly_arguments(): assert actual_arg.as_string() == expected_arg +@pytest.mark.skipif(not HAS_TYPED_AST, reason="requires typed_ast") +def test_correct_function_type_comment_parent(): + data = """ + def f(a): + # type: (A) -> A + pass + """ + astroid = builder.parse(data) + f = astroid.body[0] + assert f.type_comment_args[0].parent is f + assert f.type_comment_returns.parent is f + + def test_is_generator_for_yield_assignments(): node = astroid.extract_node( """ |