summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Walls <jacobtylerwalls@gmail.com>2023-04-15 15:26:51 -0400
committerJacob Walls <jacobtylerwalls@gmail.com>2023-04-16 09:40:26 -0400
commit309ca8dd7b4d0c95cb3cbb25180857f44050b672 (patch)
tree7311b8e1f75345afdc264c6fa217ce03be79c0ed
parent85b698466afe12c750842dc2522f2823365d9fbc (diff)
downloadastroid-git-309ca8dd7b4d0c95cb3cbb25180857f44050b672.tar.gz
Fix infer_call_result() crash on methods called with_metaclass() (#2118)
-rw-r--r--ChangeLog3
-rw-r--r--astroid/nodes/scoped_nodes/scoped_nodes.py10
-rw-r--r--tests/test_inference.py5
3 files changed, 17 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 5b35cfdf..a9b26f13 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,6 +12,9 @@ What's New in astroid 2.15.3?
=============================
Release date: TBA
+* Fix ``infer_call_result()`` crash on methods called ``with_metaclass()``.
+
+ Closes #1735
What's New in astroid 2.15.2?
diff --git a/astroid/nodes/scoped_nodes/scoped_nodes.py b/astroid/nodes/scoped_nodes/scoped_nodes.py
index 530d9e6d..5945f05d 100644
--- a/astroid/nodes/scoped_nodes/scoped_nodes.py
+++ b/astroid/nodes/scoped_nodes/scoped_nodes.py
@@ -1697,10 +1697,18 @@ class FunctionDef(_base_nodes.MultiLineBlockNode, _base_nodes.Statement, Lambda)
# generators, and filter it out later.
if (
self.name == "with_metaclass"
+ and caller is not None
and len(self.args.args) == 1
and self.args.vararg is not None
):
- metaclass = next(caller.args[0].infer(context), None)
+ if isinstance(caller.args, Arguments):
+ metaclass = next(caller.args.args[0].infer(context), None)
+ elif isinstance(caller.args, list):
+ metaclass = next(caller.args[0].infer(context), None)
+ else:
+ raise TypeError( # pragma: no cover
+ f"caller.args was neither Arguments nor list; got {type(caller.args)}"
+ )
if isinstance(metaclass, ClassDef):
try:
class_bases = [
diff --git a/tests/test_inference.py b/tests/test_inference.py
index ef99e031..86fdbcf4 100644
--- a/tests/test_inference.py
+++ b/tests/test_inference.py
@@ -4048,6 +4048,11 @@ class InferenceTest(resources.SysPathSetup, unittest.TestCase):
inferred = next(node.infer())
self.assertRaises(InferenceError, next, inferred.infer_call_result(node))
+ def test_infer_call_result_with_metaclass(self) -> None:
+ node = extract_node("def with_metaclass(meta, *bases): return 42")
+ inferred = next(node.infer_call_result(caller=node))
+ self.assertIsInstance(inferred, nodes.Const)
+
def test_context_call_for_context_managers(self) -> None:
ast_nodes = extract_node(
"""