summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniƫl van Noord <13665637+DanielNoord@users.noreply.github.com>2023-04-03 20:00:43 +0200
committerGitHub <noreply@github.com>2023-04-03 20:00:43 +0200
commitec1540d7905ec8f5e9383d928a6bfd89860b94a3 (patch)
tree3bf5c3aa61f6c502cfb24f2eacfdb409f69ee757
parent8a588e386b6f31c1223c119f40ca40346f90dd8e (diff)
downloadastroid-git-ec1540d7905ec8f5e9383d928a6bfd89860b94a3.tar.gz
Fix constructors of ``AssignName`` (#2077)
Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
-rw-r--r--ChangeLog1
-rw-r--r--astroid/interpreter/objectmodel.py14
-rw-r--r--astroid/nodes/node_classes.py30
-rw-r--r--astroid/raw_building.py36
-rw-r--r--tests/test_nodes.py7
-rw-r--r--tests/test_transforms.py18
6 files changed, 75 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog
index 7d97ecd7..da96f364 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,7 @@ Release date: TBA
Closes #1780
* Improved signature of the ``__init__`` and ``__postinit__`` methods of the following nodes:
+ - ``nodes.AssignName``
- ``nodes.BinOp``
- ``nodes.Delete``
- ``nodes.DelName``
diff --git a/astroid/interpreter/objectmodel.py b/astroid/interpreter/objectmodel.py
index 9fdf6f41..ad4db3f4 100644
--- a/astroid/interpreter/objectmodel.py
+++ b/astroid/interpreter/objectmodel.py
@@ -403,12 +403,22 @@ class FunctionModel(ObjectModel):
we get a new object which has two parameters, *self* and *type*.
"""
nonlocal func
+ arguments = astroid.Arguments(parent=func.args.parent)
+
positional_or_keyword_params = func.args.args.copy()
- positional_or_keyword_params.append(astroid.AssignName(name="type"))
+ positional_or_keyword_params.append(
+ astroid.AssignName(
+ name="type",
+ lineno=0,
+ col_offset=0,
+ parent=arguments,
+ end_lineno=None,
+ end_col_offset=None,
+ )
+ )
positional_only_params = func.args.posonlyargs.copy()
- arguments = astroid.Arguments(parent=func.args.parent)
arguments.postinit(
args=positional_or_keyword_params,
posonlyargs=positional_only_params,
diff --git a/astroid/nodes/node_classes.py b/astroid/nodes/node_classes.py
index 087e3734..2d0400ff 100644
--- a/astroid/nodes/node_classes.py
+++ b/astroid/nodes/node_classes.py
@@ -408,33 +408,17 @@ class AssignName(_base_nodes.NoChildrenNode, LookupMixIn, _base_nodes.ParentAssi
infer_lhs: ClassVar[InferLHS[AssignName]]
- @decorators.deprecate_default_argument_values(name="str")
def __init__(
self,
- name: str | None = None,
- lineno: int | None = None,
- col_offset: int | None = None,
- parent: NodeNG | None = None,
+ name: str,
+ lineno: int,
+ col_offset: int,
+ parent: NodeNG,
*,
- end_lineno: int | None = None,
- end_col_offset: int | None = None,
+ end_lineno: int | None,
+ end_col_offset: int | None,
) -> None:
- """
- :param name: The name that is assigned to.
-
- :param lineno: The line that this node appears on in the source code.
-
- :param col_offset: The column that this node appears on in the
- source code.
-
- :param parent: The parent node in the syntax tree.
-
- :param end_lineno: The last line this node appears on in the source code.
-
- :param end_col_offset: The end column this node appears on in the
- source code. Note: This is after the last symbol.
- """
- self.name: str | None = name
+ self.name = name
"""The name that is assigned to."""
super().__init__(
diff --git a/astroid/raw_building.py b/astroid/raw_building.py
index 8b949b4c..383a243b 100644
--- a/astroid/raw_building.py
+++ b/astroid/raw_building.py
@@ -128,7 +128,19 @@ def build_function(
# (in contrast to when there are no arguments and args == []). We pass
# this to the builder to indicate this.
if args is not None:
- arguments = [nodes.AssignName(name=arg, parent=argsnode) for arg in args]
+ # We set the lineno and col_offset to 0 because we don't have any
+ # information about the location of the function definition.
+ arguments = [
+ nodes.AssignName(
+ name=arg,
+ parent=argsnode,
+ lineno=0,
+ col_offset=0,
+ end_lineno=None,
+ end_col_offset=None,
+ )
+ for arg in args
+ ]
else:
arguments = None
@@ -150,16 +162,34 @@ def build_function(
else:
kwonlydefault_nodes = None
+ # We set the lineno and col_offset to 0 because we don't have any
+ # information about the location of the kwonly and posonlyargs.
argsnode.postinit(
args=arguments,
defaults=default_nodes,
kwonlyargs=[
- nodes.AssignName(name=arg, parent=argsnode) for arg in kwonlyargs or ()
+ nodes.AssignName(
+ name=arg,
+ parent=argsnode,
+ lineno=0,
+ col_offset=0,
+ end_lineno=None,
+ end_col_offset=None,
+ )
+ for arg in kwonlyargs or ()
],
kw_defaults=kwonlydefault_nodes,
annotations=[],
posonlyargs=[
- nodes.AssignName(name=arg, parent=argsnode) for arg in posonlyargs or ()
+ nodes.AssignName(
+ name=arg,
+ parent=argsnode,
+ lineno=0,
+ col_offset=0,
+ end_lineno=None,
+ end_col_offset=None,
+ )
+ for arg in posonlyargs or ()
],
)
func.postinit(
diff --git a/tests/test_nodes.py b/tests/test_nodes.py
index b51bd926..9d5f3ba0 100644
--- a/tests/test_nodes.py
+++ b/tests/test_nodes.py
@@ -1018,7 +1018,12 @@ class AliasesTest(unittest.TestCase):
def test_assname(node: AssignName) -> AssignName | None:
if node.name == "foo":
return nodes.AssignName(
- "bar", node.lineno, node.col_offset, node.parent
+ "bar",
+ node.lineno,
+ node.col_offset,
+ node.parent,
+ end_lineno=node.end_lineno,
+ end_col_offset=node.end_col_offset,
)
return None
diff --git a/tests/test_transforms.py b/tests/test_transforms.py
index 8494694d..8eb4cdea 100644
--- a/tests/test_transforms.py
+++ b/tests/test_transforms.py
@@ -88,7 +88,14 @@ class TestTransforms(unittest.TestCase):
def test_transform_patches_locals(self) -> None:
def transform_function(node: FunctionDef) -> None:
assign = nodes.Assign()
- name = nodes.AssignName(name="value")
+ name = nodes.AssignName(
+ name="value",
+ lineno=0,
+ col_offset=0,
+ parent=assign,
+ end_lineno=None,
+ end_col_offset=None,
+ )
assign.targets = [name]
assign.value = nodes.const_factory(42)
node.body.append(assign)
@@ -183,7 +190,14 @@ class TestTransforms(unittest.TestCase):
def test_transforms_are_called_for_builtin_modules(self) -> None:
# Test that transforms are called for builtin modules.
def transform_function(node: FunctionDef) -> FunctionDef:
- name = nodes.AssignName(name="value")
+ name = nodes.AssignName(
+ name="value",
+ lineno=0,
+ col_offset=0,
+ parent=node.args,
+ end_lineno=None,
+ end_col_offset=None,
+ )
node.args.args = [name]
return node