Skip to content

Commit 17c2f64

Browse files
committed
fixup! make constants have synthetic root as their parent
1 parent 3969f5d commit 17c2f64

File tree

2 files changed

+16
-22
lines changed

2 files changed

+16
-22
lines changed

astroid/nodes/scoped_nodes/scoped_nodes.py

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,15 @@ def function_to_method(n, klass):
171171
return n
172172

173173

174+
def _infer_last(
175+
arg: SuccessfulInferenceResult, context: InferenceContext
176+
) -> InferenceResult:
177+
res = util.Uninferable
178+
for b in arg.infer(context=context.clone()):
179+
res = b
180+
return res
181+
182+
174183
class Module(LocalsDictNodeNG):
175184
"""Class representing an :class:`ast.Module` node.
176185
@@ -1540,10 +1549,7 @@ def infer_yield_result(self, context: InferenceContext | None = None):
15401549
"""
15411550
for yield_ in self.nodes_of_class(node_classes.Yield):
15421551
if yield_.value is None:
1543-
const = node_classes.Const(None)
1544-
const.parent = yield_
1545-
const.lineno = yield_.lineno
1546-
yield const
1552+
yield node_classes.Const(None, parent=yield_, lineno=yield_.lineno)
15471553
elif yield_.scope() == self:
15481554
yield from yield_.value.infer(context=context)
15491555

@@ -1553,6 +1559,8 @@ def infer_call_result(
15531559
context: InferenceContext | None = None,
15541560
) -> Iterator[InferenceResult]:
15551561
"""Infer what the function returns when called."""
1562+
if context is None:
1563+
context = InferenceContext()
15561564
if self.is_generator():
15571565
if isinstance(self, AsyncFunctionDef):
15581566
generator_cls: type[bases.Generator] = bases.AsyncGenerator
@@ -1584,16 +1592,7 @@ def infer_call_result(
15841592
f"caller.args was neither Arguments nor list; got {type(caller.args)}"
15851593
)
15861594
if isinstance(metaclass, ClassDef):
1587-
try:
1588-
# Find the first non-None inferred base value
1589-
get_base = lambda arg: next(
1590-
b
1591-
for b in arg.infer(context=context.clone() if context else None)
1592-
if not (isinstance(b, node_classes.Const) and b.value is None)
1593-
)
1594-
class_bases = [get_base(arg) for arg in caller.args[1:]]
1595-
except StopIteration as e:
1596-
raise InferenceError(node=caller.args[1:], context=context) from e
1595+
class_bases = [_infer_last(x, context) for x in caller.args[1:]]
15971596
new_class = ClassDef(
15981597
name="temporary_class",
15991598
lineno=0,
@@ -2825,13 +2824,8 @@ def _inferred_bases(self, context: InferenceContext | None = None):
28252824

28262825
for stmt in self.bases:
28272826
try:
2828-
# Find the first non-None inferred base value
2829-
baseobj = next(
2830-
b
2831-
for b in stmt.infer(context=context.clone())
2832-
if not (isinstance(b, node_classes.Const) and b.value is None)
2833-
)
2834-
except (InferenceError, StopIteration):
2827+
baseobj = _infer_last(stmt, context)
2828+
except InferenceError:
28352829
continue
28362830
if isinstance(baseobj, bases.Instance):
28372831
baseobj = baseobj._proxied

tests/test_regrtest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ def with_metaclass(meta, *bases):
248248
class metaclass(meta):
249249
def __new__(cls, name, this_bases, d):
250250
return meta(name, bases, d)
251-
return type.__new__(metaclass, 'temporary_class', (), {})
251+
return type.__new__(metaclass, 'temporary_class', (), {})
252252
253253
import lala
254254

0 commit comments

Comments
 (0)