1
0
forked from VimPlug/jedi

some easier memoization for fast parser

This commit is contained in:
Dave Halter
2014-01-15 15:48:16 +01:00
parent d5aa36cc69
commit d71cdded6e
2 changed files with 39 additions and 27 deletions

View File

@@ -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):

View File

@@ -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