1
0
forked from VimPlug/jedi

A lot of work toward a better diff parser API.

This commit is contained in:
Dave Halter
2017-03-25 01:51:03 +01:00
parent ac0d0869c9
commit 7874026ee5
4 changed files with 29 additions and 10 deletions

View File

@@ -15,8 +15,7 @@ import sys
from jedi.parser.python import load_grammar from jedi.parser.python import load_grammar
from jedi.parser.python import tree from jedi.parser.python import tree
from jedi.parser.python.diff import FastParser from jedi.parser.python import parse
from jedi.parser.utils import save_parser
from jedi import debug from jedi import debug
from jedi import settings from jedi import settings
from jedi import common from jedi import common
@@ -133,10 +132,13 @@ class Script(object):
@cache.memoize_method @cache.memoize_method
def _get_module_node(self): def _get_module_node(self):
parser = FastParser(self._grammar, self._source, self.path) return parse(
save_parser(self._grammar, self.path, parser, pickling=False) code=self._source,
path=self.path,
return parser.get_root_node() grammar=self._grammar,
cache=True,
diff_cache=True,
)
@cache.memoize_method @cache.memoize_method
def _get_module(self): def _get_module(self):

View File

@@ -7,8 +7,10 @@ from jedi._compatibility import FileNotFoundError
from jedi.parser.pgen2.pgen import generate_grammar from jedi.parser.pgen2.pgen import generate_grammar
from jedi.parser.python.parser import Parser, ParserWithRecovery, \ from jedi.parser.python.parser import Parser, ParserWithRecovery, \
_remove_last_newline _remove_last_newline
from jedi.parser.python.diff import DiffParser
from jedi.parser.tokenize import source_tokens from jedi.parser.tokenize import source_tokens
from jedi.parser import utils from jedi.parser import utils
from jedi.common import splitlines
_loaded_grammars = {} _loaded_grammars = {}
@@ -93,14 +95,28 @@ def parse(code=None, path=None, grammar=None, error_recovery=True,
kwargs = {} kwargs = {}
if error_recovery: if error_recovery:
parser = ParserWithRecovery parser = ParserWithRecovery
kwargs = dict(module_path=path)
else: else:
kwargs = dict(start_symbol=start_symbol) kwargs = dict(start_symbol=start_symbol)
parser = Parser parser = Parser
# TODO add recovery
if diff_cache:
try:
parser_cache_item = utils.parser_cache[path]
except KeyError:
pass
else:
p = parser_cache_item.parser
lines = splitlines(code, keepends=True)
new_node = DiffParser(p).update(lines)
p._parsed = new_node
utils.save_parser(grammar, path, p, pickling=False)
return new_node
p = parser(grammar, code, start_parsing=False, **kwargs) p = parser(grammar, code, start_parsing=False, **kwargs)
module = p.parse(tokens=tokens) module = p.parse(tokens=tokens)
if added_newline: if added_newline:
_remove_last_newline(module) _remove_last_newline(module)
if use_cache: if use_cache or diff_cache:
utils.save_parser(grammar, path, parser) utils.save_parser(grammar, path, p)
return module return module

View File

@@ -12,7 +12,6 @@ from collections import namedtuple
from jedi._compatibility import use_metaclass from jedi._compatibility import use_metaclass
from jedi import settings from jedi import settings
from jedi.common import splitlines from jedi.common import splitlines
from jedi.parser.python import load_grammar
from jedi.parser.python.parser import ParserWithRecovery, _remove_last_newline from jedi.parser.python.parser import ParserWithRecovery, _remove_last_newline
from jedi.parser.python.tree import EndMarker from jedi.parser.python.tree import EndMarker
from jedi.parser.utils import parser_cache from jedi.parser.utils import parser_cache
@@ -138,6 +137,7 @@ def load_diff_parser(path, python_version=None):
class NewDiffParser(object): class NewDiffParser(object):
def __init__(self, path, python_version=None): def __init__(self, path, python_version=None):
self._path = path self._path = path
from jedi.parser.python import load_grammar
grammar = load_grammar(version=python_version) grammar = load_grammar(version=python_version)
self._parser = ParserWithRecovery(grammar) self._parser = ParserWithRecovery(grammar)
self._module = None self._module = None

View File

@@ -65,6 +65,7 @@ def load_parser(grammar, path):
""" """
p_time = os.path.getmtime(path) if path else None p_time = os.path.getmtime(path) if path else None
try: try:
# TODO Add grammar sha256
parser_cache_item = parser_cache[path] parser_cache_item = parser_cache[path]
if not path or p_time <= parser_cache_item.change_time: if not path or p_time <= parser_cache_item.change_time:
return parser_cache_item.parser return parser_cache_item.parser
@@ -82,7 +83,7 @@ def save_parser(grammar, path, parser, pickling=True):
item = ParserCacheItem(parser, p_time) item = ParserCacheItem(parser, p_time)
parser_cache[path] = item parser_cache[path] = item
if settings.use_filesystem_cache and pickling: if settings.use_filesystem_cache and pickling and path is not None:
ParserPickling.save_parser(grammar, path, item) ParserPickling.save_parser(grammar, path, item)