1
0
forked from VimPlug/jedi

Remove an occurance of the complicated parser creation.

This commit is contained in:
Dave Halter
2017-03-14 19:27:03 +01:00
parent 97fc3bc23c
commit 717bfeb574
3 changed files with 22 additions and 9 deletions

View File

@@ -22,8 +22,8 @@ x support for type hint comments for functions, `# type: (int, str) -> int`.
import itertools import itertools
import os import os
from jedi.parser import Parser, ParseError, ParserWithRecovery, tree from jedi.parser import ParseError, tree
from jedi.parser.python import load_grammar from jedi.parser.python import parse
from jedi.common import unite from jedi.common import unite
from jedi.evaluate.cache import memoize_default from jedi.evaluate.cache import memoize_default
from jedi.evaluate import compiled from jedi.evaluate import compiled
@@ -62,9 +62,11 @@ def _fix_forward_reference(context, node):
if isinstance(evaled_node, compiled.CompiledObject) and \ if isinstance(evaled_node, compiled.CompiledObject) and \
isinstance(evaled_node.obj, str): isinstance(evaled_node.obj, str):
try: try:
p = Parser(load_grammar(), _compatibility.unicode(evaled_node.obj), new_node = parse(
start_symbol='eval_input') _compatibility.unicode(evaled_node.obj),
new_node = p.get_parsed_node() start_symbol='eval_input',
error_recovery=False
)
except ParseError: except ParseError:
debug.warning('Annotation not parsed: %s' % evaled_node.obj) debug.warning('Annotation not parsed: %s' % evaled_node.obj)
return node return node
@@ -116,8 +118,7 @@ def _get_typing_replacement_module():
os.path.abspath(os.path.join(__file__, "../jedi_typing.py")) os.path.abspath(os.path.join(__file__, "../jedi_typing.py"))
with open(typing_path) as f: with open(typing_path) as f:
code = _compatibility.unicode(f.read()) code = _compatibility.unicode(f.read())
p = ParserWithRecovery(load_grammar(), code) _typing_module = parse(code)
_typing_module = p.module
return _typing_module return _typing_module

View File

@@ -1,2 +1,7 @@
from jedi.parser.parser import Parser, ParserWithRecovery, ParseError from jedi.parser.parser import Parser, ParserWithRecovery, ParseError
from jedi.parser.pgen2.pgen import generate_grammar from jedi.parser.pgen2.pgen import generate_grammar
def parse(grammar, code):
raise NotImplementedError
Parser(grammar, code)

View File

@@ -41,7 +41,11 @@ def load_grammar(version=None):
return load_grammar() return load_grammar()
def parse(code, grammar=None, error_recovery=True): def parse(code, grammar=None, error_recovery=True, start_symbol='file_input'):
if start_symbol != 'file_input' and error_recovery:
raise Exception(
'The start_symbol is only allowed when error recovery is disabled.')
added_newline = not code.endswith('\n') added_newline = not code.endswith('\n')
if added_newline: if added_newline:
code += '\n' code += '\n'
@@ -50,11 +54,14 @@ def parse(code, grammar=None, error_recovery=True):
grammar = load_grammar() grammar = load_grammar()
tokens = source_tokens(code, use_exact_op_types=True) tokens = source_tokens(code, use_exact_op_types=True)
kwargs = {}
if error_recovery: if error_recovery:
parser = ParserWithRecovery parser = ParserWithRecovery
else: else:
kwargs = dict(start_symbol=start_symbol)
parser = Parser parser = Parser
p = parser(grammar, code, tokens=tokens) p = parser(grammar, code, tokens=tokens, **kwargs)
if added_newline: if added_newline:
p.remove_last_newline() p.remove_last_newline()
return p.get_root_node() return p.get_root_node()