From cbcaa851084d9ee952e92208b1346b3d114b415c Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Wed, 13 Feb 2013 22:48:06 +0100 Subject: [PATCH] Add :attr:`Definition.names` --- jedi/api_classes.py | 34 ++++++++++++++++++++++++++++++++++ test/regression.py | 9 ++++----- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/jedi/api_classes.py b/jedi/api_classes.py index 5ef0c02e..6d4aac98 100644 --- a/jedi/api_classes.py +++ b/jedi/api_classes.py @@ -271,6 +271,40 @@ class Definition(BaseDefinition): def __init__(self, definition): super(Definition, self).__init__(definition, definition.start_pos) + @property + def names(self): + """ + Name of variable/function/class/module. + + For example, for ``isinstance`` it returns ``['isinstance']``. + As it is possible to have multiple definition in a statement, + this attribute returns a list of string. + + :rtype: list of str + """ + d = self.definition + if isinstance(d, er.InstanceElement): + d = d.var + if isinstance(d, pr.Name): + d = d.parent + + if isinstance(d, er.Array): + return [unicode(d.type)] + elif isinstance(d, (pr.Class, er.Class, er.Instance, + er.Function, pr.Function)): + return [unicode(d.name)] + elif isinstance(d, pr.Module): + return [self.module_name] + elif isinstance(d, pr.Import): + return [n.names[-1] for n in d.get_defined_names()] + elif isinstance(d, pr.Statement): + try: + return [a.values[0][0].name.names[-1] + for (_, a) in d.assignment_details] + except IndexError: + pass + return [] + @property def description(self): """ diff --git a/test/regression.py b/test/regression.py index e46062b3..5974711a 100755 --- a/test/regression.py +++ b/test/regression.py @@ -402,11 +402,10 @@ class TestGetDefinitions(TestBase): pass data = None """) - desc = lambda i: definitions[i].description - assert desc(0) == 'import module' - assert desc(1) == 'class Class' - assert desc(2) == 'def func' - assert desc(3) == 'data=None' + assert definitions[0].names == ['module'] + assert definitions[1].names == ['Class'] + assert definitions[2].names == ['func'] + assert definitions[3].names == ['data'] class TestSpeed(TestBase):