1
0
forked from VimPlug/jedi

evaluator stuff for dynamic

This commit is contained in:
Dave Halter
2013-12-25 01:54:51 +01:00
parent dd804dc4cb
commit ef764d39d8
7 changed files with 24 additions and 21 deletions

View File

@@ -30,8 +30,8 @@ from jedi.evaluate import representation as er
from jedi import keywords from jedi import keywords
from jedi.evaluate import builtin from jedi.evaluate import builtin
from jedi.evaluate import imports from jedi.evaluate import imports
import api_classes from jedi.evaluate import dynamic
import dynamic from jedi import api_classes
class NotFoundError(Exception): class NotFoundError(Exception):

View File

@@ -14,7 +14,7 @@ from jedi import cache
from jedi.evaluate import representation as er from jedi.evaluate import representation as er
from jedi.evaluate import imports from jedi.evaluate import imports
from jedi import keywords from jedi import keywords
import dynamic from jedi.evaluate import dynamic
def _clear_caches(): def _clear_caches():

View File

@@ -32,8 +32,8 @@ DOCSTRING_RETURN_PATTERNS = [
REST_ROLE_PATTERN = re.compile(r':[^`]+:`([^`]+)`') REST_ROLE_PATTERN = re.compile(r':[^`]+:`([^`]+)`')
@memoize_default(None) @memoize_default(None, is_function=True)
def follow_param(param): def follow_param(evaluator, param):
func = param.parent_function func = param.parent_function
# print func, param, param.parent_function # print func, param, param.parent_function
param_str = _search_param_in_docstr(func.docstr, str(param.get_name())) param_str = _search_param_in_docstr(func.docstr, str(param.get_name()))
@@ -52,7 +52,7 @@ def follow_param(param):
p = Parser(param_str, None, user_position, no_docstr=True) p = Parser(param_str, None, user_position, no_docstr=True)
if p.user_stmt is None: if p.user_stmt is None:
return [] return []
return evaluate.follow_statement(p.user_stmt) return evaluator.follow_statement(p.user_stmt)
return [] return []

View File

@@ -83,7 +83,7 @@ from jedi.evaluate import imports
from jedi.evaluate import recursion from jedi.evaluate import recursion
from jedi.evaluate.cache import memoize_default from jedi.evaluate.cache import memoize_default
from jedi import docstrings from jedi import docstrings
from jedi import dynamic from jedi.evaluate import dynamic
def get_defined_names_for_position(scope, position=None, start_scope=None): def get_defined_names_for_position(scope, position=None, start_scope=None):
@@ -263,7 +263,7 @@ class Evaluator(object):
""" """
if not r.is_generated: if not r.is_generated:
res_new += dynamic.search_params(r) res_new += dynamic.search_params(self, r)
if not res_new: if not res_new:
c = r.get_commands()[0] c = r.get_commands()[0]
if c in ('*', '**'): if c in ('*', '**'):

View File

@@ -5,7 +5,8 @@
""" """
def memoize_default(default, cache_is_in_self=False, first_arg_is_evaluator=False): def memoize_default(default, cache_is_in_self=False, is_function=False,
first_arg_is_evaluator=False):
""" This is a typical memoization decorator, BUT there is one difference: """ This is a typical memoization decorator, BUT there is one difference:
To prevent recursion it sets defaults. To prevent recursion it sets defaults.
@@ -15,7 +16,9 @@ def memoize_default(default, cache_is_in_self=False, first_arg_is_evaluator=Fals
""" """
def func(function): def func(function):
def wrapper(obj, *args, **kwargs): def wrapper(obj, *args, **kwargs):
if cache_is_in_self: if is_function:
cache = obj
elif cache_is_in_self:
cache = obj.memoize_cache cache = obj.memoize_cache
elif first_arg_is_evaluator: # needed for meta classes elif first_arg_is_evaluator: # needed for meta classes
cache = args[0].memoize_cache cache = args[0].memoize_cache

View File

@@ -110,7 +110,7 @@ def get_directory_modules_for_name(mods, name):
yield c yield c
def search_param_memoize(func): def _search_param_memoize(func):
""" """
Is only good for search params memoize, respectively the closure, Is only good for search params memoize, respectively the closure,
because it just caches the input, not the func, like normal memoize does. because it just caches the input, not the func, like normal memoize does.
@@ -137,8 +137,8 @@ class ParamListener(object):
self.param_possibilities.append(params) self.param_possibilities.append(params)
@memoize_default([]) @memoize_default([], is_function=True)
def search_params(param): def search_params(evaluator, param):
""" """
This is a dynamic search for params. If you try to complete a type: This is a dynamic search for params. If you try to complete a type:
@@ -158,7 +158,7 @@ def search_params(param):
""" """
Returns the values of a param, or an empty array. Returns the values of a param, or an empty array.
""" """
@search_param_memoize @_search_param_memoize
def get_posibilities(module, func_name): def get_posibilities(module, func_name):
try: try:
possible_stmts = module.used_names[func_name] possible_stmts = module.used_names[func_name]
@@ -190,12 +190,12 @@ def search_params(param):
continue continue
scopes = [scope] scopes = [scope]
if first: if first:
scopes = evaluate.follow_call_path(iter(first), scope, pos) scopes = evaluator.follow_call_path(iter(first), scope, pos)
pos = None pos = None
for scope in scopes: for scope in scopes:
s = evaluate.find_name(scope, func_name, position=pos, s = evaluator.find_name(scope, func_name, position=pos,
search_global=not first, search_global=not first,
resolve_decorator=False) resolve_decorator=False)
c = [getattr(escope, 'base_func', None) or escope.base c = [getattr(escope, 'base_func', None) or escope.base
for escope in s for escope in s
@@ -203,7 +203,7 @@ def search_params(param):
if compare in c: if compare in c:
# only if we have the correct function we execute # only if we have the correct function we execute
# it, otherwise just ignore it. # it, otherwise just ignore it.
evaluate.follow_paths(iter(last), s, scope) evaluator.follow_paths(iter(last), s, scope)
return listener.param_possibilities return listener.param_possibilities
@@ -211,7 +211,7 @@ def search_params(param):
for params in get_posibilities(module, func_name): for params in get_posibilities(module, func_name):
for p in params: for p in params:
if str(p) == param_name: if str(p) == param_name:
result += evaluate.follow_statement(p.parent) result += evaluator.follow_statement(p.parent)
return result return result
func = param.get_parent_until(pr.Function) func = param.get_parent_until(pr.Function)

View File

@@ -25,7 +25,7 @@ from jedi.evaluate import recursion
from jedi.evaluate.cache import memoize_default, CachedMetaClass from jedi.evaluate.cache import memoize_default, CachedMetaClass
from jedi.evaluate.interfaces import Iterable from jedi.evaluate.interfaces import Iterable
from jedi import docstrings from jedi import docstrings
from jedi import dynamic from jedi.evaluate import dynamic
class Executable(pr.IsScope): class Executable(pr.IsScope):