1
0
forked from VimPlug/jedi

Jedi didn't care for decorator 'dotted_name' nodes and therefore descriptor tests failed.

This commit is contained in:
Dave Halter
2014-11-18 15:44:32 +01:00
parent 90ce1ac47f
commit b0109343e4
3 changed files with 13 additions and 4 deletions

View File

@@ -192,6 +192,12 @@ class Evaluator(object):
# `x if foo else y` case. # `x if foo else y` case.
return (self.eval_element(element.children[0]) + return (self.eval_element(element.children[0]) +
self.eval_element(element.children[-1])) 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: else:
return precedence.calculate_children(self, element.children) return precedence.calculate_children(self, element.children)

View File

@@ -293,7 +293,6 @@ class NameFinder(object):
for name in names: for name in names:
typ = name.get_definition() typ = name.get_definition()
print(name, typ)
if typ.isinstance(pr.ForStmt): if typ.isinstance(pr.ForStmt):
for_types = self._evaluator.eval_element(typ.children[-3]) for_types = self._evaluator.eval_element(typ.children[-3])
for_types = iterable.get_iterator_types(for_types) for_types = iterable.get_iterator_types(for_types)

View File

@@ -101,6 +101,7 @@ class Instance(use_metaclass(CachedMetaClass, Executed)):
# Generated instances are classes that are just generated by self # Generated instances are classes that are just generated by self
# (No var_args) used. # (No var_args) used.
self.is_generated = is_generated self.is_generated = is_generated
self.decorates = None
@property @property
def py__call__(self): def py__call__(self):
@@ -228,7 +229,11 @@ class Instance(use_metaclass(CachedMetaClass, Executed)):
return getattr(self.base, name) return getattr(self.base, name)
def __repr__(self): def __repr__(self):
return "<e%s of %s %s>" % (type(self).__name__, self.base, self.var_args) dec = ''
if self.decorates is not None:
dec = " decorates " + repr(self.decorates)
return "<e%s of %s(%s)%s>" % (type(self).__name__, self.base,
self.var_args.argument_node, dec)
def get_instance_el(evaluator, instance, var, is_class_var=False): 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): def __init__(self, evaluator, base):
self._evaluator = evaluator self._evaluator = evaluator
self.base = base self.base = base
self.decorates = None
@memoize_default(default=()) @memoize_default(default=())
def py__mro__(self, evaluator): def py__mro__(self, evaluator):
@@ -498,7 +502,7 @@ class Function(use_metaclass(CachedMetaClass, Wrapper)):
debug.warning('multiple wrappers found %s %s', debug.warning('multiple wrappers found %s %s',
self.base_func, wrappers) self.base_func, wrappers)
f = wrappers[0] f = wrappers[0]
if isinstance(f, (Class, Function)): if isinstance(f, (Instance, Function)):
f.decorates = self f.decorates = self
debug.dbg('decorator end %s', f) debug.dbg('decorator end %s', f)