diff --git a/jedi/evaluate/pep0484.py b/jedi/evaluate/pep0484.py index fac5acc3..ca2a52c8 100644 --- a/jedi/evaluate/pep0484.py +++ b/jedi/evaluate/pep0484.py @@ -22,8 +22,8 @@ x support for type hint comments for functions, `# type: (int, str) -> int`. import itertools import os -from jedi.parser import Parser, ParseError, ParserWithRecovery, tree -from jedi.parser.python import load_grammar +from jedi.parser import ParseError, tree +from jedi.parser.python import parse from jedi.common import unite from jedi.evaluate.cache import memoize_default from jedi.evaluate import compiled @@ -62,9 +62,11 @@ def _fix_forward_reference(context, node): if isinstance(evaled_node, compiled.CompiledObject) and \ isinstance(evaled_node.obj, str): try: - p = Parser(load_grammar(), _compatibility.unicode(evaled_node.obj), - start_symbol='eval_input') - new_node = p.get_parsed_node() + new_node = parse( + _compatibility.unicode(evaled_node.obj), + start_symbol='eval_input', + error_recovery=False + ) except ParseError: debug.warning('Annotation not parsed: %s' % evaled_node.obj) return node @@ -116,8 +118,7 @@ def _get_typing_replacement_module(): os.path.abspath(os.path.join(__file__, "../jedi_typing.py")) with open(typing_path) as f: code = _compatibility.unicode(f.read()) - p = ParserWithRecovery(load_grammar(), code) - _typing_module = p.module + _typing_module = parse(code) return _typing_module diff --git a/jedi/parser/__init__.py b/jedi/parser/__init__.py index a0afeadd..da183116 100644 --- a/jedi/parser/__init__.py +++ b/jedi/parser/__init__.py @@ -1,2 +1,7 @@ from jedi.parser.parser import Parser, ParserWithRecovery, ParseError from jedi.parser.pgen2.pgen import generate_grammar + + +def parse(grammar, code): + raise NotImplementedError + Parser(grammar, code) diff --git a/jedi/parser/python/__init__.py b/jedi/parser/python/__init__.py index 1350d107..ea0a9ff9 100644 --- a/jedi/parser/python/__init__.py +++ b/jedi/parser/python/__init__.py @@ -41,7 +41,11 @@ def load_grammar(version=None): 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') if added_newline: code += '\n' @@ -50,11 +54,14 @@ def parse(code, grammar=None, error_recovery=True): grammar = load_grammar() tokens = source_tokens(code, use_exact_op_types=True) + kwargs = {} if error_recovery: parser = ParserWithRecovery else: + kwargs = dict(start_symbol=start_symbol) parser = Parser - p = parser(grammar, code, tokens=tokens) + p = parser(grammar, code, tokens=tokens, **kwargs) if added_newline: p.remove_last_newline() + return p.get_root_node()