diff --git a/jedi/api/classes.py b/jedi/api/classes.py index efd30110..d2064aad 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -632,6 +632,11 @@ class Definition(use_metaclass(CachedMetaClass, BaseDefinition)): iterable = list(iterable) return list(chain.from_iterable(iterable)) + def parent(self): + scope = self._definition.get_parent_until(pr.IsScope, include_current=False) + non_flow = scope.get_parent_until(pr.Flow, reverse=True) + return Definition(self._evaluator, non_flow) + class CallSignature(Definition): """ diff --git a/test/test_api/test_api_classes.py b/test/test_api/test_api_classes.py index bdb6b5ba..e7328102 100644 --- a/test/test_api/test_api_classes.py +++ b/test/test_api/test_api_classes.py @@ -146,17 +146,19 @@ def test_signature_params(): class TestParent(TestCase): def _parent(self, source): - defs = Script(dedent(source)).goto_definitions() + defs = Script(dedent(source)).goto_assignments() assert len(defs) == 1 return defs[0].parent() def test_parent(self): - parent = self._parent('foo') - assert isinstance(parent, pr.SubModule) + parent = self._parent('foo=1\nfoo') + assert parent.type == 'module' parent = self._parent(''' def spam(): if 1: - ''') - assert isinstance(parent, pr.SubModule) - assert isinstance(parent.parent(), pr.SubModule) + y=1 + y''') + assert parent.name == 'spam' + print(parent, parent.parent()) + assert parent.parent().type == 'module'