From b0109343e4a9870584c56a33a11b3fd974ca5007 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 18 Nov 2014 15:44:32 +0100 Subject: [PATCH] Jedi didn't care for decorator 'dotted_name' nodes and therefore descriptor tests failed. --- jedi/evaluate/__init__.py | 6 ++++++ jedi/evaluate/finder.py | 1 - jedi/evaluate/representation.py | 10 +++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index fa535ab1..4fda12db 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -192,6 +192,12 @@ class Evaluator(object): # `x if foo else y` case. return (self.eval_element(element.children[0]) + self.eval_element(element.children[-1])) + elif pr.is_node(element, 'dotted_name'): + types = self._eval_atom(element.children[0]) + for next_name in element.children[2::2]: + types = list(chain.from_iterable(self.find_types(typ, next_name) + for typ in types)) + return types else: return precedence.calculate_children(self, element.children) diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index e371067d..0677a7b2 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -293,7 +293,6 @@ class NameFinder(object): for name in names: typ = name.get_definition() - print(name, typ) if typ.isinstance(pr.ForStmt): for_types = self._evaluator.eval_element(typ.children[-3]) for_types = iterable.get_iterator_types(for_types) diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index 7ce49600..fbbf1a2f 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -101,6 +101,7 @@ class Instance(use_metaclass(CachedMetaClass, Executed)): # Generated instances are classes that are just generated by self # (No var_args) used. self.is_generated = is_generated + self.decorates = None @property def py__call__(self): @@ -228,7 +229,11 @@ class Instance(use_metaclass(CachedMetaClass, Executed)): return getattr(self.base, name) def __repr__(self): - return "" % (type(self).__name__, self.base, self.var_args) + dec = '' + if self.decorates is not None: + dec = " decorates " + repr(self.decorates) + return "" % (type(self).__name__, self.base, + self.var_args.argument_node, dec) def get_instance_el(evaluator, instance, var, is_class_var=False): @@ -356,7 +361,6 @@ class Class(use_metaclass(CachedMetaClass, Wrapper)): def __init__(self, evaluator, base): self._evaluator = evaluator self.base = base - self.decorates = None @memoize_default(default=()) def py__mro__(self, evaluator): @@ -498,7 +502,7 @@ class Function(use_metaclass(CachedMetaClass, Wrapper)): debug.warning('multiple wrappers found %s %s', self.base_func, wrappers) f = wrappers[0] - if isinstance(f, (Class, Function)): + if isinstance(f, (Instance, Function)): f.decorates = self debug.dbg('decorator end %s', f)