summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAshley Whetter <ashley@awhetter.co.uk>2021-01-30 22:40:55 -0800
committerAshley Whetter <ashley@awhetter.co.uk>2021-01-31 09:47:19 -0800
commit217aa531a438c3b25cea8ecfd1bb0b834f5bc4f8 (patch)
treece9f320767e20e60e7138913173bcee0ee260208
parent5f67396894c79c4661e357ec8bb03aa134a51109 (diff)
downloadastroid-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--ChangeLog7
-rw-r--r--astroid/rebuilder.py8
-rw-r--r--tests/unittest_nodes.py13
3 files changed, 24 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 9ff42a6e..be30ed45 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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(
"""