forked from VimPlug/jedi
basic caching of fast_parser modules.
This commit is contained in:
@@ -182,8 +182,6 @@ class FastParser(use_metaclass(CachedFastParser)):
|
|||||||
def update(self, code, user_position=None):
|
def update(self, code, user_position=None):
|
||||||
self.user_position = user_position
|
self.user_position = user_position
|
||||||
self.reset_caches()
|
self.reset_caches()
|
||||||
self.parsers = []
|
|
||||||
self.module = Module(self.parsers)
|
|
||||||
|
|
||||||
self._parse(code)
|
self._parse(code)
|
||||||
|
|
||||||
@@ -200,28 +198,46 @@ class FastParser(use_metaclass(CachedFastParser)):
|
|||||||
parts[0] += parts[1]
|
parts[0] += parts[1]
|
||||||
parts.pop(1)
|
parts.pop(1)
|
||||||
|
|
||||||
self.parsers = []
|
#self.parsers[:] = []
|
||||||
self.module.parsers = self.parsers
|
|
||||||
hashes = {p.hash:p for p in self.parsers}
|
hashes = {p.hash:p for p in self.parsers}
|
||||||
|
#print set(hashes)
|
||||||
|
|
||||||
line_offset = 0
|
line_offset = 0
|
||||||
start = 0
|
start = 0
|
||||||
p = None
|
p = None
|
||||||
|
parser_order = 0
|
||||||
for code_part in parts:
|
for code_part in parts:
|
||||||
lines = code_part.count('\n')
|
lines = code_part.count('\n')
|
||||||
if p is None or line_offset >= p.end_pos[0] - 2:
|
if p is None or line_offset >= p.end_pos[0] - 2:
|
||||||
|
# check if code_part has already been parsed
|
||||||
h = hash(code_part)
|
h = hash(code_part)
|
||||||
|
|
||||||
|
p = None
|
||||||
if h in hashes:
|
if h in hashes:
|
||||||
print(h)
|
p = hashes[h]
|
||||||
|
m = p.module
|
||||||
|
m.line_offset += line_offset + 1 - m.start_pos[0]
|
||||||
|
if self.user_position is not None and \
|
||||||
|
m.start_pos >= self.user_position >= m.end_pos:
|
||||||
|
#print(h, line_offset, m.start_pos, lines)
|
||||||
|
p = None
|
||||||
|
else:
|
||||||
|
del hashes[h]
|
||||||
|
|
||||||
|
if p is None:
|
||||||
p = parsing.PyFuzzyParser(code[start:],
|
p = parsing.PyFuzzyParser(code[start:],
|
||||||
self.module_path, self.user_position,
|
self.module_path, self.user_position,
|
||||||
line_offset=line_offset, stop_on_scope=True,
|
line_offset=line_offset, stop_on_scope=True,
|
||||||
top_module=self.module)
|
top_module=self.module)
|
||||||
|
|
||||||
|
p.hash = h
|
||||||
p.module.parent = self.module
|
p.module.parent = self.module
|
||||||
self.parsers.append(p)
|
self.parsers.insert(parser_order, p)
|
||||||
|
|
||||||
|
parser_order += 1
|
||||||
line_offset += lines
|
line_offset += lines
|
||||||
start += len(code_part)
|
start += len(code_part)
|
||||||
|
self.parsers[parser_order + 1:] = []
|
||||||
|
|
||||||
def reset_caches(self):
|
def reset_caches(self):
|
||||||
self._user_scope = None
|
self._user_scope = None
|
||||||
|
|||||||
@@ -1234,6 +1234,9 @@ class PyFuzzyParser(object):
|
|||||||
# because of `self.module.used_names`.
|
# because of `self.module.used_names`.
|
||||||
d.parent = self.module
|
d.parent = self.module
|
||||||
|
|
||||||
|
self.start_pos = self.module.start_pos
|
||||||
|
self.end_pos = self.module.start_pos
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<%s: %s>" % (type(self).__name__, self.module)
|
return "<%s: %s>" % (type(self).__name__, self.module)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user