From 8e61f3f60fea1c002a05fb6f82ce59ea5d18c12e Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Mon, 18 Oct 2021 20:12:27 +1100 Subject: [PATCH] Fix _ComprehensionVisitor.get_pyobject() This should return AssignedName rather than DefinedName/PyDefinedObject. Fix this error when analyzing module containing comprehensions: TypeError: 'PyDefinedObject' object is not subscriptable --- rope/base/pyobjectsdef.py | 6 ++++-- ropetest/advanced_oi_test.py | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 267e8acf5..6d7ac99b8 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -579,10 +579,12 @@ def _comprehension(self, node): def _Name(self, node): if isinstance(node.ctx, ast.Store): - self.names[node.id] = DefinedName(self._get_pyobject(node)) + self.names[node.id] = self._get_pyobject(node) def _get_pyobject(self, node): - return pyobjects.PyDefinedObject(None, node, self.owner_object) + return pynames.AssignedName( + lineno=node.lineno, module=self.get_module() + ) class _GlobalVisitor(_ScopeVisitor): diff --git a/ropetest/advanced_oi_test.py b/ropetest/advanced_oi_test.py index 6337b2b1f..72549a46f 100644 --- a/ropetest/advanced_oi_test.py +++ b/ropetest/advanced_oi_test.py @@ -1124,3 +1124,12 @@ def f(p): a_class = pymod["A"].get_object() x_var = pymod["x"].get_object().get_type() self.assertEqual(a_class, x_var) + + def test_set_comprehension(self): + code = dedent("""\ + x = {s.strip() for s in X()} + x.add('x') + """) + self.mod.write(code) + pymod = self.project.get_pymodule(self.mod) + x_var = pymod['x'].pyobject.get()