Skip to content

Commit 351c8de

Browse files
committed
Fix constructors of BaseContainer and Dict
1 parent fb238f1 commit 351c8de

File tree

7 files changed

+156
-96
lines changed

7 files changed

+156
-96
lines changed

ChangeLog

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ Release date: TBA
5858
- ``nodes.Attribute``
5959
- ``nodes.AugAssign``
6060
- ``nodes.Await``
61+
- ``nodes.BaseContainer``
6162
- ``nodes.BinOp``
6263
- ``nodes.Call``
6364
- ``nodes.ClassDef``
@@ -67,6 +68,7 @@ Release date: TBA
6768
- ``nodes.Delete``
6869
- ``nodes.DelAttr``
6970
- ``nodes.DelName``
71+
- ``nodes.Dict``
7072
- ``nodes.DictComp``
7173
- ``nodes.ExceptHandler``
7274
- ``nodes.Expr``

astroid/arguments.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ def infer_argument(
254254
lineno=funcnode.args.lineno,
255255
col_offset=funcnode.args.col_offset,
256256
parent=funcnode.args,
257+
end_lineno=funcnode.args.end_lineno,
258+
end_col_offset=funcnode.args.end_col_offset,
257259
)
258260
kwarg.postinit(
259261
[(nodes.const_factory(key), value) for key, value in kwargs.items()]

astroid/brain/brain_builtin_inference.py

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
from __future__ import annotations
88

99
import itertools
10-
from collections.abc import Iterator
10+
from collections.abc import Callable, Iterable, Iterator
1111
from functools import partial
12+
from typing import Any
1213

13-
from astroid import arguments, helpers, inference_tip, nodes, objects, util
14+
from astroid import arguments, bases, helpers, inference_tip, nodes, objects, util
1415
from astroid.builder import AstroidBuilder
1516
from astroid.context import InferenceContext
1617
from astroid.exceptions import (
@@ -22,7 +23,7 @@
2223
)
2324
from astroid.manager import AstroidManager
2425
from astroid.nodes import scoped_nodes
25-
from astroid.typing import InferenceResult
26+
from astroid.typing import InferenceResult, SuccessfulInferenceResult
2627

2728
OBJECT_DUNDER_NEW = "object.__new__"
2829

@@ -196,10 +197,21 @@ def _transform_wrapper(node, context: InferenceContext | None = None):
196197
)
197198

198199

199-
def _container_generic_inference(node, context, node_type, transform):
200+
def _container_generic_inference(
201+
node: nodes.Call,
202+
context: InferenceContext | None,
203+
node_type: type[nodes.BaseContainer],
204+
transform: Callable[[SuccessfulInferenceResult], nodes.BaseContainer | None],
205+
) -> nodes.BaseContainer:
200206
args = node.args
201207
if not args:
202-
return node_type()
208+
return node_type(
209+
lineno=node.lineno,
210+
col_offset=node.col_offset,
211+
parent=node.parent,
212+
end_lineno=node.end_lineno,
213+
end_col_offset=node.end_col_offset,
214+
)
203215
if len(node.args) > 1:
204216
raise UseInferenceDefault()
205217

@@ -219,8 +231,12 @@ def _container_generic_inference(node, context, node_type, transform):
219231

220232

221233
def _container_generic_transform( # pylint: disable=inconsistent-return-statements
222-
arg, context, klass, iterables, build_elts
223-
):
234+
arg: SuccessfulInferenceResult,
235+
context: InferenceContext | None,
236+
klass: type[nodes.BaseContainer],
237+
iterables: tuple[type[nodes.NodeNG] | type[bases.Proxy], ...],
238+
build_elts: type[Iterable[Any]],
239+
) -> nodes.BaseContainer | None:
224240
if isinstance(arg, klass):
225241
return arg
226242
if isinstance(arg, iterables):
@@ -251,8 +267,12 @@ def _container_generic_transform( # pylint: disable=inconsistent-return-stateme
251267

252268

253269
def _infer_builtin_container(
254-
node, context, klass=None, iterables=None, build_elts=None
255-
):
270+
node: nodes.Call,
271+
context: InferenceContext | None,
272+
klass: type[nodes.BaseContainer],
273+
iterables: tuple[type[nodes.NodeNG] | type[bases.Proxy], ...],
274+
build_elts: type[Iterable[Any]],
275+
) -> nodes.BaseContainer:
256276
transform_func = partial(
257277
_container_generic_transform,
258278
context=context,
@@ -337,7 +357,7 @@ def is_iterable(n):
337357
return items
338358

339359

340-
def infer_dict(node, context: InferenceContext | None = None):
360+
def infer_dict(node: nodes.Call, context: InferenceContext | None = None) -> nodes.Dict:
341361
"""Try to infer a dict call to a Dict node.
342362
343363
The function treats the following cases:
@@ -360,7 +380,13 @@ def infer_dict(node, context: InferenceContext | None = None):
360380

361381
if not args and not kwargs:
362382
# dict()
363-
return nodes.Dict()
383+
return nodes.Dict(
384+
lineno=node.lineno,
385+
col_offset=node.col_offset,
386+
parent=node.parent,
387+
end_lineno=node.end_lineno,
388+
end_col_offset=node.end_col_offset,
389+
)
364390
if kwargs and not args:
365391
# dict(a=1, b=2, c=4)
366392
items = [(nodes.Const(key), value) for key, value in kwargs]
@@ -374,7 +400,11 @@ def infer_dict(node, context: InferenceContext | None = None):
374400
else:
375401
raise UseInferenceDefault()
376402
value = nodes.Dict(
377-
col_offset=node.col_offset, lineno=node.lineno, parent=node.parent
403+
col_offset=node.col_offset,
404+
lineno=node.lineno,
405+
parent=node.parent,
406+
end_lineno=node.end_lineno,
407+
end_col_offset=node.end_col_offset,
378408
)
379409
value.postinit(items)
380410
return value
@@ -853,7 +883,11 @@ def infer_dict_fromkeys(node, context: InferenceContext | None = None):
853883

854884
def _build_dict_with_elements(elements):
855885
new_node = nodes.Dict(
856-
col_offset=node.col_offset, lineno=node.lineno, parent=node.parent
886+
col_offset=node.col_offset,
887+
lineno=node.lineno,
888+
parent=node.parent,
889+
end_lineno=node.end_lineno,
890+
end_col_offset=node.end_col_offset,
857891
)
858892
new_node.postinit(elements)
859893
return new_node

astroid/brain/brain_namedtuple_enum.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -466,9 +466,23 @@ def name(self):
466466
node.locals[local] = new_targets
467467

468468
# The undocumented `_value2member_map_` member:
469-
node.locals["_value2member_map_"] = [nodes.Dict(parent=node)]
470-
471-
members = nodes.Dict(parent=node)
469+
node.locals["_value2member_map_"] = [
470+
nodes.Dict(
471+
parent=node,
472+
lineno=node.lineno,
473+
col_offset=node.col_offset,
474+
end_lineno=node.end_lineno,
475+
end_col_offset=node.end_col_offset,
476+
)
477+
]
478+
479+
members = nodes.Dict(
480+
parent=node,
481+
lineno=node.lineno,
482+
col_offset=node.col_offset,
483+
end_lineno=node.end_lineno,
484+
end_col_offset=node.end_col_offset,
485+
)
472486
members.postinit(
473487
[
474488
(

astroid/inference.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,11 @@ def infer_sequence(
130130
if has_starred_named_expr:
131131
values = _infer_sequence_helper(self, context)
132132
new_seq = type(self)(
133-
lineno=self.lineno, col_offset=self.col_offset, parent=self.parent
133+
lineno=self.lineno,
134+
col_offset=self.col_offset,
135+
parent=self.parent,
136+
end_lineno=self.end_lineno,
137+
end_col_offset=self.end_col_offset,
134138
)
135139
new_seq.postinit(values)
136140

@@ -151,7 +155,13 @@ def infer_map(
151155
yield self
152156
else:
153157
items = _infer_map(self, context)
154-
new_seq = type(self)(self.lineno, self.col_offset, self.parent)
158+
new_seq = type(self)(
159+
self.lineno,
160+
self.col_offset,
161+
self.parent,
162+
end_lineno=self.end_lineno,
163+
end_col_offset=self.end_col_offset,
164+
)
155165
new_seq.postinit(list(items.items()))
156166
yield new_seq
157167

astroid/interpreter/objectmodel.py

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,13 @@
4747

4848

4949
def _dunder_dict(instance, attributes):
50-
obj = node_classes.Dict(parent=instance)
50+
obj = node_classes.Dict(
51+
parent=instance,
52+
lineno=instance.lineno,
53+
col_offset=instance.col_offset,
54+
end_lineno=instance.end_lineno,
55+
end_col_offset=instance.end_col_offset,
56+
)
5157

5258
# Convert the keys to node strings
5359
keys = [
@@ -263,7 +269,13 @@ def attr___defaults__(self):
263269

264270
@property
265271
def attr___annotations__(self):
266-
obj = node_classes.Dict(parent=self._instance)
272+
obj = node_classes.Dict(
273+
parent=self._instance,
274+
lineno=self._instance.lineno,
275+
col_offset=self._instance.col_offset,
276+
end_lineno=self._instance.end_lineno,
277+
end_col_offset=self._instance.end_col_offset,
278+
)
267279

268280
if not self._instance.returns:
269281
returns = None
@@ -297,7 +309,13 @@ def attr___annotations__(self):
297309

298310
@property
299311
def attr___dict__(self):
300-
return node_classes.Dict(parent=self._instance)
312+
return node_classes.Dict(
313+
parent=self._instance,
314+
lineno=self._instance.lineno,
315+
col_offset=self._instance.col_offset,
316+
end_lineno=self._instance.end_lineno,
317+
end_col_offset=self._instance.end_col_offset,
318+
)
301319

302320
attr___globals__ = attr___dict__
303321

@@ -314,7 +332,13 @@ def _default_args(args, parent):
314332
yield name, default
315333

316334
args = self._instance.args
317-
obj = node_classes.Dict(parent=self._instance)
335+
obj = node_classes.Dict(
336+
parent=self._instance,
337+
lineno=self._instance.lineno,
338+
col_offset=self._instance.col_offset,
339+
end_lineno=self._instance.end_lineno,
340+
end_col_offset=self._instance.end_col_offset,
341+
)
318342
defaults = dict(_default_args(args, obj))
319343

320344
obj.postinit(list(defaults.items()))
@@ -567,7 +591,13 @@ def infer_call_result(
567591

568592
@property
569593
def attr___dict__(self):
570-
return node_classes.Dict(parent=self._instance)
594+
return node_classes.Dict(
595+
parent=self._instance,
596+
lineno=self._instance.lineno,
597+
col_offset=self._instance.col_offset,
598+
end_lineno=self._instance.end_lineno,
599+
end_col_offset=self._instance.end_col_offset,
600+
)
571601

572602
@property
573603
def attr___call__(self):

0 commit comments

Comments
 (0)