Set lineno and end_lineno on Arguments (#2865)
diff --git a/ChangeLog b/ChangeLog index 4225d5f..6c662b9 100644 --- a/ChangeLog +++ b/ChangeLog
@@ -16,6 +16,8 @@ Closes #2741 Closes pylint-dev/pylint#6094 +* ``lineno`` and ``end_lineno`` are now available on ``Arguments``. + * Add helper to iterate over all annotations nodes of function arguments, ``Arguments.get_annotations()``.
diff --git a/astroid/rebuilder.py b/astroid/rebuilder.py index 97f3a39..f7d38a9 100644 --- a/astroid/rebuilder.py +++ b/astroid/rebuilder.py
@@ -9,6 +9,7 @@ from __future__ import annotations import ast +import itertools import sys import token from collections.abc import Callable, Collection, Generator @@ -589,6 +590,16 @@ type_comment_kwonlyargs=type_comment_kwonlyargs, type_comment_posonlyargs=type_comment_posonlyargs, ) + if start_end_lineno_pairs := [ + (arg.lineno, arg.end_lineno) + for arg in itertools.chain( + node.args, node.posonlyargs, node.kwonlyargs, [node.vararg, node.kwarg] + ) + if arg + ]: + newnode.lineno = min(startend[0] for startend in start_end_lineno_pairs) + newnode.end_lineno = max(startend[1] for startend in start_end_lineno_pairs) + # save argument names in locals: assert newnode.parent if vararg:
diff --git a/tests/test_nodes_lineno.py b/tests/test_nodes_lineno.py index f8c6f91..25fb339 100644 --- a/tests/test_nodes_lineno.py +++ b/tests/test_nodes_lineno.py
@@ -589,6 +589,8 @@ assert (f1.body[0].lineno, f1.body[0].col_offset) == (6, 4) assert (f1.body[0].end_lineno, f1.body[0].end_col_offset) == (6, 8) + assert (f1.args.lineno, f1.args.end_lineno) == (2, 4) + # pos only arguments # TODO fix column offset: arg -> arg (AssignName) assert isinstance(f1.args.posonlyargs[0], nodes.AssignName)