From 3ad67a4ec7ca8c603d5fa5c7522767e88fded0d4 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sun, 10 Jul 2016 18:15:06 +0200 Subject: [PATCH] Jedi raised an error when defined_names was called on empty functions, fixes #697. --- jedi/evaluate/finder.py | 3 +++ test/test_api/test_defined_names.py | 26 ++++++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index 864d90f6..311b8788 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -58,6 +58,9 @@ def filter_definition_names(names, origin, position=None): Filter names that are actual definitions in a scope. Names that are just used will be ignored. """ + if not names: + return [] + # Just calculate the scope from the first stmt = names[0].get_definition() scope = stmt.get_parent_scope() diff --git a/test/test_api/test_defined_names.py b/test/test_api/test_defined_names.py index 3eb41356..aae1f6ca 100644 --- a/test/test_api/test_defined_names.py +++ b/test/test_api/test_defined_names.py @@ -2,19 +2,19 @@ Tests for `api.defined_names`. """ -import textwrap +from textwrap import dedent -from jedi import api +from jedi import defined_names, names from ..helpers import TestCase class TestDefinedNames(TestCase): - def assert_definition_names(self, definitions, names): - assert [d.name for d in definitions] == names + def assert_definition_names(self, definitions, names_): + assert [d.name for d in definitions] == names_ - def check_defined_names(self, source, names): - definitions = api.names(textwrap.dedent(source)) - self.assert_definition_names(definitions, names) + def check_defined_names(self, source, names_): + definitions = names(dedent(source)) + self.assert_definition_names(definitions, names_) return definitions def test_get_definitions_flat(self): @@ -76,7 +76,17 @@ class TestDefinedNames(TestCase): def test_follow_imports(): # github issue #344 - imp = api.defined_names('import datetime')[0] + imp = defined_names('import datetime')[0] assert imp.name == 'datetime' datetime_names = [str(d.name) for d in imp.defined_names()] assert 'timedelta' in datetime_names + + +def test_names_twice(): + source = dedent(''' + def lol(): + pass + ''') + + defs = names(source=source) + assert defs[0].defined_names() == []