Skip to content

Commit ee2d4bd

Browse files
Fix infer_call_result() crash on methods called with_metaclass() (#2118)
1 parent 495581f commit ee2d4bd

File tree

3 files changed

+17
-1
lines changed

3 files changed

+17
-1
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ What's New in astroid 2.15.3?
6161
=============================
6262
Release date: TBA
6363

64+
* Fix ``infer_call_result()`` crash on methods called ``with_metaclass()``.
65+
66+
Closes #1735
6467

6568

6669
What's New in astroid 2.15.2?

astroid/nodes/scoped_nodes/scoped_nodes.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1692,10 +1692,18 @@ def infer_call_result(self, caller=None, context: InferenceContext | None = None
16921692
# generators, and filter it out later.
16931693
if (
16941694
self.name == "with_metaclass"
1695+
and caller is not None
16951696
and len(self.args.args) == 1
16961697
and self.args.vararg is not None
16971698
):
1698-
metaclass = next(caller.args[0].infer(context), None)
1699+
if isinstance(caller.args, Arguments):
1700+
metaclass = next(caller.args.args[0].infer(context), None)
1701+
elif isinstance(caller.args, list):
1702+
metaclass = next(caller.args[0].infer(context), None)
1703+
else:
1704+
raise TypeError( # pragma: no cover
1705+
f"caller.args was neither Arguments nor list; got {type(caller.args)}"
1706+
)
16991707
if isinstance(metaclass, ClassDef):
17001708
try:
17011709
class_bases = [

tests/test_inference.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4055,6 +4055,11 @@ class C:
40554055
inferred = next(node.infer())
40564056
self.assertRaises(InferenceError, next, inferred.infer_call_result(node))
40574057

4058+
def test_infer_call_result_with_metaclass(self) -> None:
4059+
node = extract_node("def with_metaclass(meta, *bases): return 42")
4060+
inferred = next(node.infer_call_result(caller=node))
4061+
self.assertIsInstance(inferred, nodes.Const)
4062+
40584063
def test_context_call_for_context_managers(self) -> None:
40594064
ast_nodes = extract_node(
40604065
"""

0 commit comments

Comments
 (0)