forked from VimPlug/jedi
A lot of work toward a better diff parser API.
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user