1
0
forked from VimPlug/jedi

RecursionDecorator now also works with Evaluator caches

This commit is contained in:
Dave Halter
2013-12-24 19:14:14 +01:00
parent 118ed2e0a3
commit 85a12e8866
4 changed files with 23 additions and 22 deletions

View File

@@ -24,7 +24,7 @@ def _clear_caches():
""" """
cache.clear_caches() cache.clear_caches()
dynamic.search_param_cache.clear() dynamic.search_param_cache.clear()
#recursion.ExecutionRecursionDecorator.reset() recursion.ExecutionRecursionDecorator.reset()
evaluate.follow_statement.reset() evaluate.follow_statement.reset()

View File

@@ -117,7 +117,8 @@ def get_defined_names_for_position(scope, position=None, start_scope=None):
class Evaluator(object): class Evaluator(object):
def __init__(self): def __init__(self):
self.memoize_cache = {} self.memoize_cache = {} # for memoize decorators
self.recursion_detector = recursion.RecursionDetector()
def get_names_of_scope(self, scope, position=None, star_search=True, def get_names_of_scope(self, scope, position=None, star_search=True,
include_builtin=True): include_builtin=True):
@@ -475,7 +476,7 @@ class Evaluator(object):
return descriptor_check(remove_statements(filter_name(scope_generator))) return descriptor_check(remove_statements(filter_name(scope_generator)))
@memoize_default(default=(), cache_is_in_self=True) @memoize_default(default=(), cache_is_in_self=True)
@recursion.RecursionDecorator @recursion.recursion_decorator
def follow_statement(self, stmt, seek_name=None): def follow_statement(self, stmt, seek_name=None):
""" """
The starting point of the completion. A statement always owns a call list, The starting point of the completion. A statement always owns a call list,

View File

@@ -187,7 +187,7 @@ class ImportPath(pr.Base):
""" """
Returns the imported modules. Returns the imported modules.
""" """
if self._evaluator.follow_statement.push_stmt(self.import_stmt): if self._evaluator.recursion_detector.push_stmt(self.import_stmt):
# check recursion # check recursion
return [] return []
@@ -229,7 +229,7 @@ class ImportPath(pr.Base):
scopes = [ImportPath.GlobalNamespace] scopes = [ImportPath.GlobalNamespace]
debug.dbg('after import', scopes) debug.dbg('after import', scopes)
self._evaluator.follow_statement.pop_stmt() self._evaluator.recursion_detector.pop_stmt()
return scopes return scopes
def _is_relative_import(self): def _is_relative_import(self):

View File

@@ -14,23 +14,27 @@ from jedi.evaluate import builtin
from jedi.evaluate import interfaces from jedi.evaluate import interfaces
class RecursionDecorator(object): def recursion_decorator(func):
def run(evaluator, stmt, *args, **kwargs):
rec_detect = evaluator.recursion_detector
# print stmt, len(self.node_statements())
if rec_detect.push_stmt(stmt):
return []
else:
result = func(evaluator, stmt, *args, **kwargs)
rec_detect.pop_stmt()
return result
return run
class RecursionDetector(object):
""" """
A decorator to detect recursions in statements. In a recursion a statement A decorator to detect recursions in statements. In a recursion a statement
at the same place, in the same module may not be executed two times. at the same place, in the same module may not be executed two times.
""" """
def __init__(self, func): def __init__(self):
self.func = func self.top = None
self.reset() self.current = None
def __call__(self, evaluator, stmt, *args, **kwargs):
# print stmt, len(self.node_statements())
if self.push_stmt(stmt):
return []
else:
result = self.func(evaluator, stmt, *args, **kwargs)
self.pop_stmt()
return result
def push_stmt(self, stmt): def push_stmt(self, stmt):
self.current = _RecursionNode(stmt, self.current) self.current = _RecursionNode(stmt, self.current)
@@ -57,10 +61,6 @@ class RecursionDecorator(object):
if not test: if not test:
return False return False
def reset(self):
self.top = None
self.current = None
def node_statements(self): def node_statements(self):
result = [] result = []
n = self.current n = self.current