77from __future__ import annotations
88
99import itertools
10- from collections .abc import Iterator
10+ from collections .abc import Callable , Iterable , Iterator
1111from 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
1415from astroid .builder import AstroidBuilder
1516from astroid .context import InferenceContext
1617from astroid .exceptions import (
2223)
2324from astroid .manager import AstroidManager
2425from astroid .nodes import scoped_nodes
25- from astroid .typing import InferenceResult
26+ from astroid .typing import InferenceResult , SuccessfulInferenceResult
2627
2728OBJECT_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
221233def _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
253269def _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
0 commit comments