1
0
forked from VimPlug/jedi

merged _some_method and _remove_statements

This commit is contained in:
Dave Halter
2014-01-07 10:53:53 +01:00
parent d1a4eccf13
commit 546a7bbad9
2 changed files with 94 additions and 104 deletions

View File

@@ -23,7 +23,7 @@ enable_notice = False
# callback, interface: level, str
debug_function = None
ignored_modules = ['jedi.builtin', 'jedi.parser']
ignored_modules = ['jedi.evaluate.builtin', 'jedi.parser']
def reset_time():

View File

@@ -20,9 +20,10 @@ class NameFinder(object):
self.position = position
def find(self, scopes, resolve_decorator=True):
filtered = self.filter_name(scopes)
filtered = self._names_to_types(filtered, resolve_decorator)
return self._resolve_descriptors(filtered)
names = self.filter_name(scopes)
types = self._names_to_types(names, resolve_decorator)
debug.dbg('_names_to_types: %s, old: %s' % (names, types))
return self._resolve_descriptors(types)
def scopes(self, search_global=False):
if search_global:
@@ -143,7 +144,7 @@ class NameFinder(object):
def _names_to_types(self, names, resolve_decorator):
types = []
# This adds additional types
# Add isinstance and other if/assert knowledge.
flow_scope = self.scope
while flow_scope:
# TODO check if result is in scope -> no evaluation necessary
@@ -154,11 +155,11 @@ class NameFinder(object):
flow_scope = flow_scope.parent
for name in names:
types += self._some_method(name.parent)
types += self._remove_statements(name.parent, resolve_decorator)
return self._remove_statements(types, resolve_decorator)
return types
def _remove_statements(self, result, resolve_decorator=True):
def _remove_statements(self, r, resolve_decorator=True):
"""
This is the part where statements are being stripped.
@@ -167,9 +168,8 @@ class NameFinder(object):
"""
evaluator = self._evaluator
res_new = []
for r in result:
add = []
if r.isinstance(pr.Statement):
add = []
check_instance = None
if isinstance(r, er.InstanceElement) and r.is_class_var:
check_instance = r.instance
@@ -186,6 +186,25 @@ class NameFinder(object):
# execute first.
if isinstance(r, pr.Param):
func = r.parent
exc = pr.Class, pr.Function
until = lambda: func.parent.get_parent_until(exc)
if func is not None \
and isinstance(until(), pr.Class) \
and r.position_nr == 0:
# This is where self gets added - this happens at another
# place, if the var_args are clear. But sometimes the class is
# not known. Therefore add a new instance for self. Otherwise
# take the existing.
if isinstance(self.scope, er.InstanceElement):
res_new.append(self.scope.instance)
else:
for inst in self._evaluator.execute(er.Class(self._evaluator, until())):
inst.is_generated = True
res_new.append(inst)
return res_new
# Instances are typically faked, if the instance is not
# called from outside. Here we check it for __init__
# functions and return.
@@ -200,7 +219,7 @@ class NameFinder(object):
doc_params = docstrings.follow_param(evaluator, r)
if doc_params:
res_new += doc_params
continue
return res_new
if not r.is_generated:
res_new += dynamic.search_params(evaluator, r)
@@ -212,15 +231,14 @@ class NameFinder(object):
if not r.assignment_details:
# this means that there are no default params,
# so just ignore it.
continue
return res_new
# Remove the statement docstr stuff for now, that has to be
# implemented with the evaluator class.
#if r.docstr:
#res_new.append(r)
scopes = evaluator.eval_statement(r, seek_name=self.name_str)
add += self._remove_statements(scopes)
for scope in evaluator.eval_statement(r, seek_name=self.name_str):
add += self._remove_statements(scope)
if check_instance is not None:
# class renames
@@ -228,6 +246,8 @@ class NameFinder(object):
if isinstance(a, (er.Function, pr.Function))
else a for a in add]
res_new += add
elif r.isinstance(pr.ForFlow):
res_new += self._handle_for_loops(r)
else:
if isinstance(r, pr.Class):
r = er.Class(evaluator, r)
@@ -236,38 +256,8 @@ class NameFinder(object):
if r.isinstance(er.Function) and resolve_decorator:
r = r.get_decorated_func()
res_new.append(r)
debug.dbg('sfn remove, new: %s, old: %s' % (res_new, result))
return res_new
def _some_method(self, typ):
"""
Returns the parent of a name, which means the element which stands
behind a name.
"""
result = []
exc = pr.Class, pr.Function
until = lambda: typ.parent.parent.get_parent_until(exc)
if typ.isinstance(pr.ForFlow):
result += self._handle_for_loops(typ)
elif typ.isinstance(pr.Param) \
and typ.parent is not None \
and isinstance(until(), pr.Class) \
and typ.position_nr == 0:
# This is where self gets added - this happens at another
# place, if the var_args are clear. But sometimes the class is
# not known. Therefore add a new instance for self. Otherwise
# take the existing.
if isinstance(self.scope, er.InstanceElement):
result.append(self.scope.instance)
else:
for inst in self._evaluator.execute(er.Class(self._evaluator, until())):
inst.is_generated = True
result.append(inst)
elif typ is not None:
result.append(typ)
return result
def _handle_for_loops(self, loop):
# Take the first statement (for has always only
# one, remember `in`). And follow it.