1
0
forked from VimPlug/jedi

ImportPath has now also an _evaluator

This commit is contained in:
Dave Halter
2013-12-24 18:00:00 +01:00
parent d25cc6e1fe
commit 56457a9c8c
6 changed files with 104 additions and 104 deletions

View File

@@ -413,7 +413,7 @@ class Script(object):
for d in defs: for d in defs:
if isinstance(d.parent, pr.Import) \ if isinstance(d.parent, pr.Import) \
and d.start_pos == (0, 0): and d.start_pos == (0, 0):
i = imports.ImportPath(d.parent).follow(is_goto=True) i = imports.ImportPath(self._evaluator, d.parent).follow(is_goto=True)
definitions.remove(d) definitions.remove(d)
definitions |= follow_inexistent_imports(i) definitions |= follow_inexistent_imports(i)
return definitions return definitions
@@ -556,7 +556,7 @@ class Script(object):
context = self._module.get_context() context = self._module.get_context()
just_from = next(context) == 'from' just_from = next(context) == 'from'
i = imports.ImportPath(user_stmt, is_like_search, i = imports.ImportPath(self._evaluator, user_stmt, is_like_search,
kill_count=kill_count, direct_resolve=True, kill_count=kill_count, direct_resolve=True,
is_just_from=just_from) is_just_from=just_from)
return i, cur_name_part return i, cur_name_part

View File

@@ -409,7 +409,7 @@ class Completion(BaseDefinition):
if self._definition.isinstance(pr.Statement): if self._definition.isinstance(pr.Statement):
defs = evaluate.follow_statement(self._definition) defs = evaluate.follow_statement(self._definition)
elif self._definition.isinstance(pr.Import): elif self._definition.isinstance(pr.Import):
defs = imports.strip_imports([self._definition]) defs = imports.strip_imports(self._evaluator, [self._definition])
else: else:
return [self] return [self]

View File

@@ -504,7 +504,7 @@ def usages(definitions, search_name, mods):
imps.append((count, name_part)) imps.append((count, name_part))
for used_count, name_part in imps: for used_count, name_part in imps:
i = imports.ImportPath(stmt, kill_count=count - used_count, i = imports.ImportPath(_evaluator, stmt, kill_count=count - used_count,
direct_resolve=True) direct_resolve=True)
f = i.follow(is_goto=True) f = i.follow(is_goto=True)
if set(f) & set(definitions): if set(f) & set(definitions):
@@ -521,7 +521,7 @@ def usages_add_import_modules(definitions, search_name):
new = set() new = set()
for d in definitions: for d in definitions:
if isinstance(d.parent, pr.Import): if isinstance(d.parent, pr.Import):
s = imports.ImportPath(d.parent, direct_resolve=True) s = imports.ImportPath(_evaluator, d.parent, direct_resolve=True)
with common.ignored(IndexError): with common.ignored(IndexError):
new.add(s.follow(is_goto=True)[0]) new.add(s.follow(is_goto=True)[0])
return set(definitions) | new return set(definitions) | new

View File

@@ -115,7 +115,11 @@ def get_defined_names_for_position(scope, position=None, start_scope=None):
return names_new return names_new
def get_names_of_scope(scope, position=None, star_search=True, class Evaluator(object):
def __init__(self):
self.cache = None
def get_names_of_scope(self, scope, position=None, star_search=True,
include_builtin=True): include_builtin=True):
""" """
Get all completions (names) possible for the current scope. Get all completions (names) possible for the current scope.
@@ -138,7 +142,7 @@ def get_names_of_scope(scope, position=None, star_search=True,
`get_names_of_scope` is a generator. First it yields names from `get_names_of_scope` is a generator. First it yields names from
most inner scope. most inner scope.
>>> pairs = list(get_names_of_scope(scope)) >>> pairs = list(Evaluator().get_names_of_scope(scope))
>>> pairs[0] >>> pairs[0]
(<Function: func@3-4>, [<Name: y@4,4>]) (<Function: func@3-4>, [<Name: y@4,4>])
@@ -192,8 +196,8 @@ def get_names_of_scope(scope, position=None, star_search=True,
# Add star imports. # Add star imports.
if star_search: if star_search:
for s in imports.remove_star_imports(non_flow.get_parent_until()): for s in imports.remove_star_imports(self, non_flow.get_parent_until()):
for g in get_names_of_scope(s, star_search=False): for g in self.get_names_of_scope(s, star_search=False):
yield g yield g
# Add builtins to the global scope. # Add builtins to the global scope.
@@ -201,11 +205,6 @@ def get_names_of_scope(scope, position=None, star_search=True,
builtin_scope = builtin.Builtin.scope builtin_scope = builtin.Builtin.scope
yield builtin_scope, builtin_scope.get_defined_names() yield builtin_scope, builtin_scope.get_defined_names()
class Evaluator(object):
def __init__(self):
self.cache = None
def find_name(self, scope, name_str, position=None, search_global=False, def find_name(self, scope, name_str, position=None, search_global=False,
is_goto=False, resolve_decorator=True): is_goto=False, resolve_decorator=True):
""" """
@@ -458,7 +457,7 @@ class Evaluator(object):
return res_new return res_new
if search_global: if search_global:
scope_generator = get_names_of_scope(scope, position=position) scope_generator = self.get_names_of_scope(scope, position=position)
else: else:
if isinstance(scope, er.Instance): if isinstance(scope, er.Instance):
scope_generator = scope.scope_generator() scope_generator = scope.scope_generator()
@@ -545,8 +544,8 @@ class Evaluator(object):
if isinstance(call, pr.Lambda): if isinstance(call, pr.Lambda):
result.append(er.Function(call)) result.append(er.Function(call))
# With things like params, these can also be functions... # With things like params, these can also be functions...
elif isinstance(call, pr.Base) and call.isinstance(er.Function, elif isinstance(call, pr.Base) and call.isinstance(
er.Class, er.Instance, dynamic.ArrayInstance): er.Function, er.Class, er.Instance, dynamic.ArrayInstance):
result.append(call) result.append(call)
# The string tokens are just operations (+, -, etc.) # The string tokens are just operations (+, -, etc.)
elif not isinstance(call, (str, unicode)): elif not isinstance(call, (str, unicode)):
@@ -596,7 +595,7 @@ class Evaluator(object):
scopes = self.find_name(builtin.Builtin.scope, current.type_as_string()) scopes = self.find_name(builtin.Builtin.scope, current.type_as_string())
# Make instances of those number/string objects. # Make instances of those number/string objects.
scopes = [er.Instance(s, (current.value,)) for s in scopes] scopes = [er.Instance(s, (current.value,)) for s in scopes]
result = imports.strip_imports(scopes) result = imports.strip_imports(self, scopes)
return self.follow_paths(path, result, scope, position=position) return self.follow_paths(path, result, scope, position=position)
@@ -657,7 +656,7 @@ class Evaluator(object):
# This is the typical lookup while chaining things. # This is the typical lookup while chaining things.
if filter_private_variable(scope, call_scope, current): if filter_private_variable(scope, call_scope, current):
return [] return []
result = imports.strip_imports(self.find_name(scope, current, result = imports.strip_imports(self, self.find_name(scope, current,
position=position)) position=position))
return self.follow_paths(path, set(result), call_scope, position=position) return self.follow_paths(path, set(result), call_scope, position=position)

View File

@@ -44,8 +44,9 @@ class ImportPath(pr.Base):
GlobalNamespace = GlobalNamespace() GlobalNamespace = GlobalNamespace()
def __init__(self, import_stmt, is_like_search=False, kill_count=0, def __init__(self, evaluator, import_stmt, is_like_search=False, kill_count=0,
direct_resolve=False, is_just_from=False): direct_resolve=False, is_just_from=False):
self._evaluator = evaluator
self.import_stmt = import_stmt self.import_stmt = import_stmt
self.is_like_search = is_like_search self.is_like_search = is_like_search
self.direct_resolve = direct_resolve self.direct_resolve = direct_resolve
@@ -373,7 +374,7 @@ class ImportPath(pr.Base):
return f.parser.module, rest return f.parser.module, rest
def strip_imports(scopes): def strip_imports(evaluator, scopes):
""" """
Here we strip the imports - they don't get resolved necessarily. Here we strip the imports - they don't get resolved necessarily.
Really used anymore? Merge with remove_star_imports? Really used anymore? Merge with remove_star_imports?
@@ -381,25 +382,25 @@ def strip_imports(scopes):
result = [] result = []
for s in scopes: for s in scopes:
if isinstance(s, pr.Import): if isinstance(s, pr.Import):
result += ImportPath(s).follow() result += ImportPath(evaluator, s).follow()
else: else:
result.append(s) result.append(s)
return result return result
@cache.cache_star_import @cache.cache_star_import
def remove_star_imports(scope, ignored_modules=()): def remove_star_imports(evaluator, scope, ignored_modules=()):
""" """
Check a module for star imports: Check a module for star imports:
>>> from module import * >>> from module import *
and follow these modules. and follow these modules.
""" """
modules = strip_imports(i for i in scope.get_imports() if i.star) modules = strip_imports(evaluator, (i for i in scope.get_imports() if i.star))
new = [] new = []
for m in modules: for m in modules:
if m not in ignored_modules: if m not in ignored_modules:
new += remove_star_imports(m, modules) new += remove_star_imports(evaluator, m, modules)
modules += new modules += new
# Filter duplicate modules. # Filter duplicate modules.

View File

@@ -498,7 +498,7 @@ class Execution(Executable):
debug.dbg('exec result: %s in %s' % (stmts, self)) debug.dbg('exec result: %s in %s' % (stmts, self))
return imports.strip_imports(stmts) return imports.strip_imports(self._evaluator, stmts)
def _get_function_returns(self, func, evaluate_generator): def _get_function_returns(self, func, evaluate_generator):
""" A normal Function execution """ """ A normal Function execution """