forked from VimPlug/jedi
some easier memoization for fast parser
This commit is contained in:
@@ -131,6 +131,19 @@ def underscore_memoization(func):
|
|||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
def underscore_none_memoization(func):
|
||||||
|
"""Like ``underscore_memoization`` just with None instead of exceptions."""
|
||||||
|
def wrapper(self):
|
||||||
|
name = '_' + func.__name__
|
||||||
|
value = getattr(self, name)
|
||||||
|
if value is None:
|
||||||
|
value = func(self)
|
||||||
|
setattr(self, name, value)
|
||||||
|
return value
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
def cache_star_import(func):
|
def cache_star_import(func):
|
||||||
def wrapper(evaluator, scope, *args, **kwargs):
|
def wrapper(evaluator, scope, *args, **kwargs):
|
||||||
with common.ignored(KeyError):
|
with common.ignored(KeyError):
|
||||||
|
|||||||
@@ -40,18 +40,16 @@ class Module(pr.Simple, pr.Module):
|
|||||||
return getattr(self.parsers[0].module, name)
|
return getattr(self.parsers[0].module, name)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@cache.underscore_none_memoization
|
||||||
def used_names(self):
|
def used_names(self):
|
||||||
if self._used_names is None:
|
used_names = {}
|
||||||
dct = {}
|
for p in self.parsers:
|
||||||
for p in self.parsers:
|
for k, statement_set in p.module.used_names.items():
|
||||||
for k, statement_set in p.module.used_names.items():
|
if k in used_names:
|
||||||
if k in dct:
|
used_names[k] |= statement_set
|
||||||
dct[k] |= statement_set
|
else:
|
||||||
else:
|
used_names[k] = set(statement_set)
|
||||||
dct[k] = set(statement_set)
|
return used_names
|
||||||
|
|
||||||
self._used_names = dct
|
|
||||||
return self._used_names
|
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<%s: %s@%s-%s>" % (type(self).__name__, self.name,
|
return "<%s: %s@%s-%s>" % (type(self).__name__, self.name,
|
||||||
@@ -200,27 +198,28 @@ class FastParser(use_metaclass(CachedFastParser)):
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@cache.underscore_none_memoization
|
||||||
def user_scope(self):
|
def user_scope(self):
|
||||||
if self._user_scope is None:
|
user_scope = None
|
||||||
for p in self.parsers:
|
for p in self.parsers:
|
||||||
if p.user_scope:
|
if p.user_scope:
|
||||||
if isinstance(p.user_scope, pr.SubModule):
|
if isinstance(p.user_scope, pr.SubModule):
|
||||||
continue
|
continue
|
||||||
self._user_scope = p.user_scope
|
user_scope = p.user_scope
|
||||||
|
|
||||||
if isinstance(self._user_scope, pr.SubModule) \
|
if isinstance(user_scope, pr.SubModule) or user_scope is None:
|
||||||
or self._user_scope is None:
|
user_scope = self.module
|
||||||
self._user_scope = self.module
|
return user_scope
|
||||||
return self._user_scope
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@cache.underscore_none_memoization
|
||||||
def user_stmt(self):
|
def user_stmt(self):
|
||||||
if self._user_stmt is None:
|
user_stmt = None
|
||||||
for p in self.parsers:
|
for p in self.parsers:
|
||||||
if p.user_stmt:
|
if p.user_stmt:
|
||||||
self._user_stmt = p.user_stmt
|
user_stmt = p.user_stmt
|
||||||
break
|
break
|
||||||
return self._user_stmt
|
return user_stmt
|
||||||
|
|
||||||
def update(self, code, user_position=None):
|
def update(self, code, user_position=None):
|
||||||
self.user_position = user_position
|
self.user_position = user_position
|
||||||
|
|||||||
Reference in New Issue
Block a user